Merge m-c to inbound a=merge
authorWes Kocher <wkocher@mozilla.com>
Mon, 30 Jun 2014 18:47:26 -0700
changeset 191618 d0787b1eebc1f6cf8ba948a2283128cc96c0ca06
parent 191545 032a08766a8c0ad779acf95d241d70de4fd1a14c (current diff)
parent 191617 83c09fe3a6580c2e633f35e4fd44964ba9ce36d2 (diff)
child 191619 8e851f64e99fbf19a03bada9b7b3a25d01930ea5
push id45618
push userkwierso@gmail.com
push dateTue, 01 Jul 2014 01:47:43 +0000
treeherdermozilla-inbound@d0787b1eebc1 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone33.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 m-c to inbound a=merge
--- a/b2g/chrome/content/devtools.js
+++ b/b2g/chrome/content/devtools.js
@@ -22,26 +22,26 @@ XPCOMUtils.defineLazyGetter(this, 'WebCo
 XPCOMUtils.defineLazyGetter(this, 'EventLoopLagFront', function() {
   return devtools.require('devtools/server/actors/eventlooplag').EventLoopLagFront;
 });
 
 XPCOMUtils.defineLazyGetter(this, 'MemoryFront', function() {
   return devtools.require('devtools/server/actors/memory').MemoryFront;
 });
 
+Cu.import('resource://gre/modules/AppFrames.jsm');
 
 /**
  * The Developer HUD is an on-device developer tool that displays widgets,
  * showing visual debug information about apps. Each widget corresponds to a
  * metric as tracked by a metric watcher (e.g. consoleWatcher).
  */
 let developerHUD = {
 
   _targets: new Map(),
-  _frames: new Map(),
   _client: null,
   _conn: null,
   _watchers: [],
   _logging: true,
 
   /**
    * This method registers a metric watcher that will watch one or more metrics
    * on app frames that are being tracked. A watcher must implement the
@@ -72,44 +72,36 @@ let developerHUD = {
     this._client = new DebuggerClient(transport);
 
     for (let w of this._watchers) {
       if (w.init) {
         w.init(this._client);
       }
     }
 
-    Services.obs.addObserver(this, 'remote-browser-shown', false);
-    Services.obs.addObserver(this, 'inprocess-browser-shown', false);
-    Services.obs.addObserver(this, 'message-manager-disconnect', false);
+    AppFrames.addObserver(this);
 
-    let systemapp = document.querySelector('#systemapp');
-    this.trackFrame(systemapp);
-
-    let frames = systemapp.contentWindow.document.querySelectorAll('iframe[mozapp]');
-    for (let frame of frames) {
+    for (let frame of AppFrames.list()) {
       this.trackFrame(frame);
     }
 
     SettingsListener.observe('hud.logging', this._logging, enabled => {
       this._logging = enabled;
     });
   },
 
   uninit: function dwp_uninit() {
     if (!this._client)
       return;
 
     for (let frame of this._targets.keys()) {
       this.untrackFrame(frame);
     }
 
-    Services.obs.removeObserver(this, 'remote-browser-shown');
-    Services.obs.removeObserver(this, 'inprocess-browser-shown');
-    Services.obs.removeObserver(this, 'message-manager-disconnect');
+    AppFrames.removeObserver(this);
 
     this._client.close();
     delete this._client;
   },
 
   /**
    * This method will ask all registered watchers to track and update metrics
    * on an app frame.
@@ -135,51 +127,22 @@ let developerHUD = {
         w.untrackTarget(target);
       }
 
       target.destroy();
       this._targets.delete(frame);
     }
   },
 
-  observe: function dwp_observe(subject, topic, data) {
-    if (!this._client)
-      return;
-
-    let frame;
-
-    switch(topic) {
+  onAppFrameCreated: function (frame, isFirstAppFrame) {
+    this.trackFrame(frame);
+  },
 
-      // listen for frame creation in OOP (device) as well as in parent process (b2g desktop)
-      case 'remote-browser-shown':
-      case 'inprocess-browser-shown':
-        let frameLoader = subject;
-        // get a ref to the app <iframe>
-        frameLoader.QueryInterface(Ci.nsIFrameLoader);
-        // Ignore notifications that aren't from a BrowserOrApp
-        if (!frameLoader.ownerIsBrowserOrAppFrame) {
-          return;
-        }
-        frame = frameLoader.ownerElement;
-        if (!frame.appManifestURL) // Ignore all frames but app frames
-          return;
-        this.trackFrame(frame);
-        this._frames.set(frameLoader.messageManager, frame);
-        break;
-
-      // Every time an iframe is destroyed, its message manager also is
-      case 'message-manager-disconnect':
-        let mm = subject;
-        frame = this._frames.get(mm);
-        if (!frame)
-          return;
-        this.untrackFrame(frame);
-        this._frames.delete(mm);
-        break;
-    }
+  onAppFrameDestroyed: function (frame, isLastAppFrame) {
+    this.untrackFrame(frame);
   },
 
   log: function dwp_log(message) {
     if (this._logging) {
       dump(DEVELOPER_HUD_LOG_PREFIX + ': ' + message + '\n');
     }
   }
 
new file mode 100644
--- /dev/null
+++ b/b2g/components/AppFrames.jsm
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+'use strict';
+
+this.EXPORTED_SYMBOLS = ['AppFrames'];
+
+const Cu = Components.utils;
+const Ci = Components.interfaces;
+
+Cu.import('resource://gre/modules/Services.jsm');
+Cu.import('resource://gre/modules/SystemAppProxy.jsm');
+
+const listeners = [];
+
+const Observer = {
+  // Save a map of (MessageManager => Frame) to be able to dispatch
+  // the FrameDestroyed event with a frame reference.
+  _frames: new Map(),
+
+  // Also save current number of iframes opened by app
+  _apps: new Map(),
+
+  start: function () {
+    Services.obs.addObserver(this, 'remote-browser-shown', false);
+    Services.obs.addObserver(this, 'inprocess-browser-shown', false);
+    Services.obs.addObserver(this, 'message-manager-disconnect', false);
+
+    SystemAppProxy.getAppFrames().forEach((frame) => {
+      let mm = frame.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader.messageManager;
+      this._frames.set(mm, frame);
+      let mozapp = frame.getAttribute('mozapp');
+      this._apps.set(mozapp, (this._apps.get(mozapp) || 0) + 1);
+    });
+  },
+
+  stop: function () {
+    Services.obs.removeObserver(this, 'remote-browser-shown');
+    Services.obs.removeObserver(this, 'inprocess-browser-shown');
+    Services.obs.removeObserver(this, 'message-manager-disconnect');
+    this._frames.clear();
+    this._apps.clear();
+  },
+
+  observe: function (subject, topic, data) {
+    switch(topic) {
+
+      // Listen for frame creation in OOP (device) as well as in parent process (b2g desktop)
+      case 'remote-browser-shown':
+      case 'inprocess-browser-shown':
+        let frameLoader = subject;
+
+        // get a ref to the app <iframe>
+        frameLoader.QueryInterface(Ci.nsIFrameLoader);
+        let frame = frameLoader.ownerElement;
+        let mm = frame.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader.messageManager;
+        this.onMessageManagerCreated(mm, frame);
+        break;
+
+      // Every time an iframe is destroyed, its message manager also is
+      case 'message-manager-disconnect':
+        this.onMessageManagerDestroyed(subject);
+        break;
+    }
+  },
+
+  onMessageManagerCreated: function (mm, frame) {
+    this._frames.set(mm, frame);
+
+    let mozapp = frame.getAttribute('mozapp');
+    let count = (this._apps.get(mozapp) || 0) + 1;
+    this._apps.set(mozapp, count);
+
+    let isFirstAppFrame = (count === 1);
+    listeners.forEach(function (listener) {
+      try {
+        listener.onAppFrameCreated(frame, isFirstAppFrame);
+      } catch(e) {
+        dump('Exception while calling Frames.jsm listener:' + e + '\n' + e.stack + '\n');
+      }
+    });
+  },
+
+  onMessageManagerDestroyed: function (mm) {
+    let frame = this._frames.get(mm);
+    if (!frame) {
+      // We receive an event for a non mozapp message manager
+      return;
+    }
+
+    this._frames.delete(mm);
+
+    let mozapp = frame.getAttribute('mozapp');
+    let count = (this._apps.get(mozapp) || 0) - 1;
+    this._apps.set(mozapp, count);
+
+    let isLastAppFrame = (count === 0);
+    listeners.forEach(function (listener) {
+      try {
+        listener.onAppFrameDestroyed(frame, isLastAppFrame);
+      } catch(e) {
+        dump('Exception while calling Frames.jsm listener:' + e + '\n' + e.stack + '\n');
+      }
+    });
+  }
+
+};
+
+const AppFrames = this.AppFrames = {
+
+  list: () => SystemAppProxy.getAppFrames(),
+
+  addObserver: function (listener) {
+    if (listeners.indexOf(listener) !== -1) {
+      return;
+    }
+
+    listeners.push(listener);
+    if (listeners.length == 1) {
+      Observer.start();
+    }
+  },
+
+  removeObserver: function (listener) {
+    let idx = listeners.indexOf(listener);
+    if (idx !== -1) {
+      listeners.splice(idx, 1);
+    }
+    if (listeners.length === 0) {
+      Observer.stop();
+    }
+  }
+
+};
+
--- a/b2g/components/SystemAppProxy.jsm
+++ b/b2g/components/SystemAppProxy.jsm
@@ -110,13 +110,32 @@ let SystemAppProxy = {
     if (content) {
       content.removeEventListener.apply(content, arguments);
     } else {
       let idx = this._pendingListeners.indexOf(listener);
       if (idx != -1) {
         this._pendingListeners.splice(idx, 1);
       }
     }
+  },
+
+  getAppFrames: function systemApp_getAppFrames() {
+    let systemAppFrame = this._frame;
+    if (!systemAppFrame) {
+      return [];
+    }
+
+    let list = [systemAppFrame];
+
+    // List all app frames hosted in the system app: the homescreen,
+    // all regular apps, activities, rocket bar, attention screen and the keyboard.
+    // Bookmark apps and other system app internal frames like captive portal
+    // are also hosted in system app, but they are not using mozapp attribute.
+    let frames = systemAppFrame.contentDocument.querySelectorAll("iframe[mozapp]");
+    for (let i = 0; i < frames.length; i++) {
+      list.push(frames[i]);
+    }
+
+    return list;
   }
-
 };
 this.SystemAppProxy = SystemAppProxy;
 
--- a/b2g/components/moz.build
+++ b/b2g/components/moz.build
@@ -40,16 +40,17 @@ EXTRA_PP_COMPONENTS += [
 
 if CONFIG['MOZ_UPDATER']:
     EXTRA_PP_COMPONENTS += [
         'UpdatePrompt.js',
     ]
 
 EXTRA_JS_MODULES += [
     'AlertsHelper.jsm',
+    'AppFrames.jsm',
     'ContentRequestHelper.jsm',
     'ErrorPage.jsm',
     'SignInToWebsite.jsm',
     'SystemAppProxy.jsm',
     'TelURIParser.jsm',
     'WebappsUpdater.jsm',
 ]
 
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="2a165bebfa19b11b697837409f9550dd2917c46c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="3326b51017252e09ccdd715dec6c5e12a7d1ecfe"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="cc67f31dc638c0b7edba3cf7e3d87cadf0ed52bf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="276ce45e78b09c4a4ee643646f691d22804754c1">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="2a165bebfa19b11b697837409f9550dd2917c46c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="3326b51017252e09ccdd715dec6c5e12a7d1ecfe"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame/sources.xml
+++ b/b2g/config/flame/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="cc67f31dc638c0b7edba3cf7e3d87cadf0ed52bf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="e95b4ce22c825da44d14299e1190ea39a5260bde"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="471afab478649078ad7c75ec6b252481a59e19b8"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
         "git_revision": "", 
         "remote": "", 
         "branch": ""
     }, 
-    "revision": "2c2f2fa0a101f07cbb206cca2e69ef3a7b18244c", 
+    "revision": "944559e6e60f9c97bc3b9daf00d73549e0eb80a6", 
     "repo_path": "/integration/gaia-central"
 }
--- a/b2g/config/hamachi/sources.xml
+++ b/b2g/config/hamachi/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="2a165bebfa19b11b697837409f9550dd2917c46c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
--- a/b2g/config/helix/sources.xml
+++ b/b2g/config/helix/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="2a165bebfa19b11b697837409f9550dd2917c46c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="cc67f31dc638c0b7edba3cf7e3d87cadf0ed52bf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/wasabi/sources.xml
+++ b/b2g/config/wasabi/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="ics_chocolate_rb4.2" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="2a165bebfa19b11b697837409f9550dd2917c46c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bc3bbf42d2a606f6b7038881cff5ec3795fdf953"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="90bb898e8401f5fb98edcf38293073c5c26ab7bd"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="7f9ec13a30f1b2cc8bdb1a199b7da54b9ab8860f"/>
   <project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
--- a/browser/base/content/test/general/browser_tabopen_reflows.js
+++ b/browser/base/content/test/general/browser_tabopen_reflows.js
@@ -37,17 +37,17 @@ const EXPECTED_REFLOWS = [
     "GroupItems_newTab@chrome://browser/content/tabview.js|" +
     "TabItem__reconnect@chrome://browser/content/tabview.js|" +
     "TabItem@chrome://browser/content/tabview.js|" +
     "TabItems_link@chrome://browser/content/tabview.js|" +
     "TabItems_init/this._eventListeners.open@chrome://browser/content/tabview.js|",
 
   // SessionStore.getWindowDimensions()
   "ssi_getWindowDimension@resource:///modules/sessionstore/SessionStore.jsm|" +
-    "@resource:///modules/sessionstore/SessionStore.jsm|" +
+    "ssi_updateWindowFeatures/<@resource:///modules/sessionstore/SessionStore.jsm|" +
     "ssi_updateWindowFeatures@resource:///modules/sessionstore/SessionStore.jsm|" +
     "ssi_collectWindowData@resource:///modules/sessionstore/SessionStore.jsm|",
 
   // tabPreviews.capture()
   "tabPreviews_capture@chrome://browser/content/browser.js|" +
     "tabPreviews_handleEvent/<@chrome://browser/content/browser.js|",
 
   // tabPreviews.capture()
--- a/browser/devtools/inspector/test/browser.ini
+++ b/browser/devtools/inspector/test/browser.ini
@@ -31,16 +31,17 @@ support-files =
 # Disabled for too many intermittent failures (bug 851349)
 [browser_inspector_bug_840156_destroy_after_navigation.js]
 [browser_inspector_cmd_inspect.js]
 [browser_inspector_dead_node_exception.js]
 [browser_inspector_destroyselection.js]
 [browser_inspector_highlighter.js]
 [browser_inspector_iframeTest.js]
 [browser_inspector_infobar.js]
+skip-if = true # Bug 1028609
 [browser_inspector_initialization.js]
 [browser_inspector_invalidate.js]
 [browser_inspector_menu.js]
 [browser_inspector_navigation.js]
 [browser_inspector_pseudoClass_menu.js]
 [browser_inspector_pseudoclass_lock.js]
 [browser_inspector_reload.js]
 [browser_inspector_scrolling.js]
--- a/browser/devtools/styleinspector/computed-view.js
+++ b/browser/devtools/styleinspector/computed-view.js
@@ -343,17 +343,17 @@ CssHtmlTree.prototype = {
     }
 
     if (classes.contains("property-name")) {
       type = overlays.VIEW_NODE_PROPERTY_TYPE;
     } else if (classes.contains("property-value")) {
       type = overlays.VIEW_NODE_VALUE_TYPE;
     } else if (classes.contains("theme-link")) {
       type = overlays.VIEW_NODE_IMAGE_URL_TYPE;
-      value.url = node.textContent;
+      value.url = node.href;
     } else {
       return null;
     }
 
     return {
       type: type,
       value: value
     };
--- a/browser/devtools/styleinspector/rule-view.js
+++ b/browser/devtools/styleinspector/rule-view.js
@@ -1231,17 +1231,17 @@ CssRuleView.prototype = {
         pseudoElement: prop.rule.pseudoElement,
         sheetHref: prop.rule.domRule.href
       };
     } else if (classes.contains("theme-link") && prop) {
       type = overlays.VIEW_NODE_IMAGE_URL_TYPE;
       value = {
         property: getPropertyNameAndValue(node).name,
         value: node.parentNode.textContent,
-        url: node.textContent,
+        url: node.href,
         enabled: prop.enabled,
         overridden: prop.overridden,
         pseudoElement: prop.rule.pseudoElement,
         sheetHref: prop.rule.domRule.href
       };
     } else if (classes.contains("ruleview-selector-unmatched") ||
                classes.contains("ruleview-selector-matched")) {
       type = overlays.VIEW_NODE_SELECTOR_TYPE;
--- a/browser/devtools/styleinspector/style-inspector-overlays.js
+++ b/browser/devtools/styleinspector/style-inspector-overlays.js
@@ -285,20 +285,16 @@ TooltipsOverlay.prototype = {
    * @return {String} The tooltip type to be shown, or null
    */
   _getTooltipType: function({type, value:prop}) {
     let tooltipType = null;
     let inspector = this.view.inspector;
 
     // Image preview tooltip
     if (type === VIEW_NODE_IMAGE_URL_TYPE && inspector.hasUrlToImageDataResolver) {
-      let dim = Services.prefs.getIntPref(PREF_IMAGE_TOOLTIP_SIZE);
-      let uri = CssLogic.getBackgroundImageUriFromProperty(prop.value,
-        prop.sheetHref); // sheetHref is undefined for computed-view properties,
-                         // but we don't care as URIs are absolute
       tooltipType = TOOLTIP_IMAGE_TYPE;
     }
 
     // Font preview tooltip
     if (type === VIEW_NODE_VALUE_TYPE && prop.property === "font-family") {
       let value = prop.value.toLowerCase();
       if (value !== "inherit" && value !== "unset" && value !== "initial") {
         tooltipType = TOOLTIP_FONTFAMILY_TYPE;
@@ -332,20 +328,18 @@ TooltipsOverlay.prototype = {
       this.colorPicker.revert();
       this.colorPicker.hide();
     }
 
     let inspector = this.view.inspector;
 
     if (type === TOOLTIP_IMAGE_TYPE) {
       let dim = Services.prefs.getIntPref(PREF_IMAGE_TOOLTIP_SIZE);
-      let uri = CssLogic.getBackgroundImageUriFromProperty(nodeInfo.value.value,
-        nodeInfo.value.sheetHref); // sheetHref is undefined for computed-view
-                                   // properties, but we don't care as uris are
-                                   // absolute
+      // nodeInfo contains an absolute uri
+      let uri = nodeInfo.value.url;
       return this.previewTooltip.setRelativeImageContent(uri,
         inspector.inspector, dim);
     }
 
     if (type === TOOLTIP_FONTFAMILY_TYPE) {
       return this.previewTooltip.setFontFamilyContent(nodeInfo.value.value,
         inspector.selection.nodeFront);
     }
--- a/browser/devtools/styleinspector/test/browser.ini
+++ b/browser/devtools/styleinspector/test/browser.ini
@@ -95,14 +95,15 @@ skip-if = os == "win" && debug # bug 963
 [browser_styleinspector_csslogic-content-stylesheets.js]
 [browser_styleinspector_csslogic-inherited-properties.js]
 [browser_styleinspector_csslogic-specificity.js]
 [browser_styleinspector_inplace-editor.js]
 [browser_styleinspector_output-parser.js]
 [browser_styleinspector_tooltip-background-image.js]
 [browser_styleinspector_tooltip-closes-on-new-selection.js]
 [browser_styleinspector_tooltip-longhand-fontfamily.js]
+[browser_styleinspector_tooltip-multiple-background-images.js]
 [browser_styleinspector_tooltip-shorthand-fontfamily.js]
 [browser_styleinspector_tooltip-size.js]
 [browser_styleinspector_transform-highlighter-01.js]
 [browser_styleinspector_transform-highlighter-02.js]
 [browser_styleinspector_transform-highlighter-03.js]
 [browser_styleinspector_transform-highlighter-04.js]
new file mode 100644
--- /dev/null
+++ b/browser/devtools/styleinspector/test/browser_styleinspector_tooltip-multiple-background-images.js
@@ -0,0 +1,71 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Test for bug 1026921: Ensure the URL of hovered url() node is used instead
+// of the first found from the declaration  as there might be multiple urls.
+
+let YELLOW_DOT = "data:image/png;base64," +
+  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAACX" +
+  "BIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYcDCwCr0o5ngAAABl0RVh0Q29tbWVudABDcmVh" +
+  "dGVkIHdpdGggR0lNUFeBDhcAAAANSURBVAjXY/j/n6EeAAd9An7Z55GEAAAAAElFTkSuQmCC";
+
+let BLUE_DOT = "data:image/png;base64," +
+  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABmJLR0QA/wD/AP+gvaeTAAAACX" +
+  "BIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYcDCwlCkCM9QAAABl0RVh0Q29tbWVudABDcmVh" +
+  "dGVkIHdpdGggR0lNUFeBDhcAAAANSURBVAjXY2Bg+F8PAAKCAX/tPkrkAAAAAElFTkSuQmCC";
+
+let test = asyncTest(function* () {
+  let TEST_STYLE = "h1 {background: url(" + YELLOW_DOT + "), url(" + BLUE_DOT + ");}";
+
+  let PAGE_CONTENT = "<style>" + TEST_STYLE + "</style>" +
+    "<h1>browser_styleinspector_tooltip-multiple-background-images.js</h1>";
+
+  yield addTab("data:text/html,background image tooltip test");
+  content.document.body.innerHTML = PAGE_CONTENT;
+
+  yield testRuleViewUrls();
+  yield testComputedViewUrls();
+});
+
+function* testRuleViewUrls() {
+  info("Testing tooltips in the rule view");
+
+  let { view, inspector } = yield openRuleView();
+  yield selectNode("h1", inspector);
+
+  let {valueSpan} = getRuleViewProperty(view, "h1", "background");
+  yield performChecks(view, valueSpan);
+}
+
+function* testComputedViewUrls() {
+  info("Testing tooltips in the computed view");
+
+  let {view} = yield openComputedView();
+  let {valueSpan} = getComputedViewProperty(view, "background-image");
+
+  yield performChecks(view, valueSpan);
+}
+
+/**
+ * A helper that checks url() tooltips contain correct images
+ */
+function* performChecks(view, propertyValue) {
+  function checkTooltip(panel, imageSrc) {
+    let images = panel.getElementsByTagName("image");
+    is(images.length, 1, "Tooltip contains an image");
+    is(images[0].getAttribute("src"), imageSrc, "The image URL is correct");
+  }
+
+  let links = propertyValue.querySelectorAll(".theme-link");
+  let panel = view.tooltips.previewTooltip.panel;
+
+  info("Checking first link tooltip");
+  yield assertHoverTooltipOn(view.tooltips.previewTooltip, links[0]);
+  checkTooltip(panel, YELLOW_DOT);
+
+  info("Checking second link tooltip");
+  yield assertHoverTooltipOn(view.tooltips.previewTooltip, links[1]);
+  checkTooltip(panel, BLUE_DOT);
+}
--- a/browser/devtools/webaudioeditor/test/browser.ini
+++ b/browser/devtools/webaudioeditor/test/browser.ini
@@ -3,16 +3,17 @@ skip-if = e10s # Bug ?????? - devtools t
 subsuite = devtools
 support-files =
   doc_simple-context.html
   doc_complex-context.html
   doc_simple-node-creation.html
   doc_buffer-and-array.html
   doc_media-node-creation.html
   doc_destroy-nodes.html
+  doc_connect-toggle.html
   440hz_sine.ogg
   head.js
 
 [browser_audionode-actor-get-set-param.js]
 [browser_audionode-actor-get-type.js]
 [browser_audionode-actor-get-params-01.js]
 [browser_audionode-actor-get-params-02.js]
 [browser_audionode-actor-get-param-flags.js]
@@ -25,16 +26,17 @@ support-files =
 [browser_wa_first-run.js]
 [browser_wa_reset-01.js]
 [browser_wa_reset-02.js]
 [browser_wa_reset-03.js]
 
 [browser_wa_graph-click.js]
 [browser_wa_graph-render-01.js]
 [browser_wa_graph-render-02.js]
+[browser_wa_graph-render-03.js]
 [browser_wa_graph-markers.js]
 [browser_wa_graph-selected.js]
 [browser_wa_graph-zoom.js]
 
 [browser_wa_inspector.js]
 [browser_wa_inspector-toggle.js]
 
 [browser_wa_properties-view.js]
--- a/browser/devtools/webaudioeditor/test/browser_wa_graph-click.js
+++ b/browser/devtools/webaudioeditor/test/browser_wa_graph-click.js
@@ -25,30 +25,30 @@ function spawnTest() {
 
   let nodeIds = actors.map(actor => actor.actorID);
 
   ok(!WebAudioInspectorView.isVisible(), "InspectorView hidden on start.");
 
   yield clickGraphNode(panelWin, nodeIds[1], true);
 
   ok(WebAudioInspectorView.isVisible(), "InspectorView visible after selecting a node.");
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[1], "InspectorView has correct node set.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[1], "InspectorView has correct node set.");
 
   yield clickGraphNode(panelWin, nodeIds[2]);
 
   ok(WebAudioInspectorView.isVisible(), "InspectorView still visible after selecting another node.");
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[2], "InspectorView has correct node set on second node.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[2], "InspectorView has correct node set on second node.");
 
   yield clickGraphNode(panelWin, nodeIds[2]);
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[2], "Clicking the same node again works (idempotent).");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[2], "Clicking the same node again works (idempotent).");
 
   yield clickGraphNode(panelWin, $("rect", findGraphNode(panelWin, nodeIds[3])));
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[3], "Clicking on a <rect> works as expected.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[3], "Clicking on a <rect> works as expected.");
 
   yield clickGraphNode(panelWin, $("tspan", findGraphNode(panelWin, nodeIds[4])));
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[4], "Clicking on a <tspan> works as expected.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[4], "Clicking on a <tspan> works as expected.");
 
   ok(WebAudioInspectorView.isVisible(),
     "InspectorView still visible after several nodes have been clicked.");
 
   yield teardown(panel);
   finish();
 }
new file mode 100644
--- /dev/null
+++ b/browser/devtools/webaudioeditor/test/browser_wa_graph-render-03.js
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests to ensure that selected nodes stay selected on graph redraw.
+ */
+
+function spawnTest() {
+  let [target, debuggee, panel] = yield initWebAudioEditor(CONNECT_TOGGLE_URL);
+  let { panelWin } = panel;
+  let { gFront, $, $$, EVENTS } = panelWin;
+
+  reload(target);
+
+  let [actors] = yield Promise.all([
+    getN(gFront, "create-node", 3),
+    waitForGraphRendered(panelWin, 3, 2)
+  ]);
+
+  let nodeIDs = actors.map(actor => actor.actorID);
+
+  yield clickGraphNode(panelWin, nodeIDs[1]);
+  ok(findGraphNode(panelWin, nodeIDs[1]).classList.contains("selected"),
+    "Node selected once.");
+
+  yield once(panelWin, EVENTS.UI_GRAPH_RENDERED);
+  
+  ok(findGraphNode(panelWin, nodeIDs[1]).classList.contains("selected"),
+    "Node still selected after rerender.");
+
+  yield teardown(panel);
+  finish();
+}
+
--- a/browser/devtools/webaudioeditor/test/browser_wa_reset-03.js
+++ b/browser/devtools/webaudioeditor/test/browser_wa_reset-03.js
@@ -16,34 +16,34 @@ function spawnTest() {
   let [actors] = yield Promise.all([
     get3(gFront, "create-node"),
     waitForGraphRendered(panelWin, 3, 2)
   ]);
   let nodeIds = actors.map(actor => actor.actorID);
 
   yield clickGraphNode(panelWin, nodeIds[1], true);
   ok(WebAudioInspectorView.isVisible(), "InspectorView visible after selecting a node.");
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[1], "InspectorView has correct node set.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[1], "InspectorView has correct node set.");
 
   /**
    * Reload
    */
 
   reload(target);
 
   let [actors] = yield Promise.all([
     get3(gFront, "create-node"),
     waitForGraphRendered(panelWin, 3, 2)
   ]);
   let nodeIds = actors.map(actor => actor.actorID);
 
   ok(!WebAudioInspectorView.isVisible(), "InspectorView hidden on start.");
-  ise(WebAudioInspectorView.getCurrentNode(), null,
+  ise(WebAudioInspectorView.getCurrentAudioNode(), null,
     "InspectorView has no current node set on reset.");
 
   yield clickGraphNode(panelWin, nodeIds[2], true);
   ok(WebAudioInspectorView.isVisible(),
     "InspectorView visible after selecting a node after a reset.");
-  is(WebAudioInspectorView.getCurrentNode().id, nodeIds[2], "InspectorView has correct node set upon clicking graph node after a reset.");
+  is(WebAudioInspectorView.getCurrentAudioNode().id, nodeIds[2], "InspectorView has correct node set upon clicking graph node after a reset.");
 
   yield teardown(panel);
   finish();
 }
new file mode 100644
--- /dev/null
+++ b/browser/devtools/webaudioeditor/test/doc_connect-toggle.html
@@ -0,0 +1,27 @@
+<!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <title>Web Audio Editor test page</title>
+  </head>
+
+  <body>
+
+    <script type="text/javascript;version=1.8">
+      "use strict";
+
+      let i = 0;
+      let ctx = new AudioContext();
+      let osc = ctx.createOscillator();
+      let gain = ctx.createGain();
+      gain.gain.value = 0;
+      gain.connect(ctx.destination);
+      osc.start(0);
+      setInterval(() => ++i && (i % 2 ? osc.connect(gain) : osc.disconnect()), 1000);
+    </script>
+  </body>
+
+</html>
--- a/browser/devtools/webaudioeditor/test/head.js
+++ b/browser/devtools/webaudioeditor/test/head.js
@@ -22,16 +22,17 @@ let TargetFactory = devtools.TargetFacto
 
 const EXAMPLE_URL = "http://example.com/browser/browser/devtools/webaudioeditor/test/";
 const SIMPLE_CONTEXT_URL = EXAMPLE_URL + "doc_simple-context.html";
 const COMPLEX_CONTEXT_URL = EXAMPLE_URL + "doc_complex-context.html";
 const SIMPLE_NODES_URL = EXAMPLE_URL + "doc_simple-node-creation.html";
 const MEDIA_NODES_URL = EXAMPLE_URL + "doc_media-node-creation.html";
 const BUFFER_AND_ARRAY_URL = EXAMPLE_URL + "doc_buffer-and-array.html";
 const DESTROY_NODES_URL = EXAMPLE_URL + "doc_destroy-nodes.html";
+const CONNECT_TOGGLE_URL = EXAMPLE_URL + "doc_connect-toggle.html";
 
 // All tests are asynchronous.
 waitForExplicitFinish();
 
 let gToolEnabled = Services.prefs.getBoolPref("devtools.webaudioeditor.enabled");
 
 registerCleanupFunction(() => {
   info("finish() was called, cleaning up...");
--- a/browser/devtools/webaudioeditor/webaudioeditor-view.js
+++ b/browser/devtools/webaudioeditor/webaudioeditor-view.js
@@ -198,17 +198,17 @@ let WebAudioGraphView = {
         let edge = graph.edge(n);
         return edge.target;
       });
       return svgNodes;
     });
 
     // Override Dagre-d3's post render function by passing in our own.
     // This way we can leave styles out of it.
-    renderer.postRender(function (graph, root) {
+    renderer.postRender((graph, root) => {
       // We have to manually set the marker styling since we cannot
       // do this currently with CSS, although it is in spec for SVG2
       // https://svgwg.org/svg2-draft/painting.html#VertexMarkerProperties
       // For now, manually set it on creation, and the `_onThemeChange`
       // function will fire when the devtools theme changes to update the
       // styling manually.
       let theme = Services.prefs.getCharPref("devtools.theme");
       let markerColor = MARKER_STYLING[theme];
@@ -224,16 +224,22 @@ let WebAudioGraphView = {
           .attr("markerWidth", ARROW_WIDTH)
           .attr("markerHeight", ARROW_HEIGHT)
           .attr("orient", "auto")
           .attr("style", "fill: " + markerColor)
           .append("svg:path")
           .attr("d", "M 0 0 L 10 5 L 0 10 z");
       }
 
+      // Reselect the previously selected audio node
+      let currentNode = WebAudioInspectorView.getCurrentAudioNode();
+      if (currentNode) {
+        this.focusNode(currentNode.id);
+      }
+
       // Fire an event upon completed rendering
       window.emit(EVENTS.UI_GRAPH_RENDERED, AudioNodes.length, edges.length);
     });
 
     let layout = dagreD3.layout().rankDir("LR");
     renderer.layout(layout).run(graph, d3.select("#graph-target"));
 
     // Handle the sliding and zooming of the graph,
@@ -420,17 +426,17 @@ let WebAudioInspectorView = {
       this._buildPropertiesView()
         .then(() => window.emit(EVENTS.UI_INSPECTOR_NODE_SET, this._currentNode.id));
     }
   },
 
   /**
    * Returns the current AudioNodeView.
    */
-  getCurrentNode: function () {
+  getCurrentAudioNode: function () {
     return this._currentNode;
   },
 
   /**
    * Empties out the props view.
    */
   resetUI: function () {
     this._propsView.empty();
--- a/browser/devtools/webide/content/webide.js
+++ b/browser/devtools/webide/content/webide.js
@@ -133,16 +133,18 @@ let UI = {
         this.updateRuntimeButton();
         break;
       case "project-validated":
         this.updateTitle();
         this.updateCommands();
         this.updateProjectButton();
         this.updateProjectEditorHeader();
         break;
+      case "install-progress":
+        this.updateProgress(Math.round(100 * details.bytesSent / details.totalBytes));
     };
   },
 
   openInBrowser: function(url) {
     // Open a URL in a Firefox window
     let browserWin = Services.wm.getMostRecentWindow("navigator:browser");
     if (browserWin) {
       let gBrowser = browserWin.gBrowser;
@@ -164,44 +166,81 @@ let UI = {
 
   hidePanels: function() {
     let panels = document.querySelectorAll("panel");
     for (let p of panels) {
       p.hidePopup();
     }
   },
 
+  /********** BUSY UI **********/
+
+  _busyTimeout: null,
+  _busyOperationDescription: null,
+  _busyPromise: null,
+
+  updateProgress: function(percent) {
+    let progress = document.querySelector("#action-busy-determined");
+    progress.mode = "determined";
+    progress.value = percent;
+    this.setupBusyTimeout();
+  },
+
   busy: function() {
     this.hidePanels();
-    document.querySelector("window").classList.add("busy")
+    let win = document.querySelector("window");
+    win.classList.add("busy")
+    win.classList.add("busy-undetermined");
     this.updateCommands();
   },
 
   unbusy: function() {
-    document.querySelector("window").classList.remove("busy")
+    let win = document.querySelector("window");
+    win.classList.remove("busy")
+    win.classList.remove("busy-determined");
+    win.classList.remove("busy-undetermined");
     this.updateCommands();
     this._busyPromise = null;
   },
 
+  setupBusyTimeout: function() {
+    this.cancelBusyTimeout();
+    this._busyTimeout = setTimeout(() => {
+      this.unbusy();
+      UI.reportError("error_operationTimeout", this._busyOperationDescription);
+      this._busyPromise.reject("promise timeout: " + this._busyOperationDescription);
+    }, 30000);
+  },
+
+  cancelBusyTimeout: function() {
+    clearTimeout(this._busyTimeout);
+  },
+
+  busyWithProgressUntil: function(promise, operationDescription) {
+    this.busyUntil(promise, operationDescription);
+    let win = document.querySelector("window");
+    let progress = document.querySelector("#action-busy-determined");
+    progress.mode = "undetermined";
+    win.classList.add("busy-determined");
+    win.classList.remove("busy-undetermined");
+  },
+
   busyUntil: function(promise, operationDescription) {
     // Freeze the UI until the promise is resolved. A 30s timeout
     // will unfreeze the UI, just in case the promise never gets
     // resolved.
     this._busyPromise = promise;
-    let timeout = setTimeout(() => {
-      this.unbusy();
-      UI.reportError("error_operationTimeout", operationDescription);
-      promise.reject("promise timeout: " + operationDescription);
-    }, 30000);
+    this._busyOperationDescription = operationDescription;
+    this.setupBusyTimeout();
     this.busy();
     promise.then(() => {
-      clearTimeout(timeout);
+      this.cancelBusyTimeout();
       this.unbusy();
     }, (e) => {
-      clearTimeout(timeout);
+      this.cancelBusyTimeout();
       UI.reportError("error_operationFail", operationDescription);
       console.error(e);
       this.unbusy();
     });
     return promise;
   },
 
   reportError: function(l10nProperty, ...l10nArgs) {
@@ -391,16 +430,22 @@ let UI = {
 
     // Nothing to show
 
     if (!project) {
       this.resetDeck();
       return;
     }
 
+    // Save last project location
+
+    if (project.location) {
+      Services.prefs.setCharPref("devtools.webide.lastprojectlocation", project.location);
+    }
+
     // Make sure the directory exist before we show Project Editor
 
     let forceDetailsOnly = false;
     if (project.type == "packaged") {
       let directory = new FileUtils.File(project.location);
       forceDetailsOnly = !directory.exists();
     }
 
@@ -415,20 +460,16 @@ let UI = {
 
     // Show ProjectEditor
 
     this.selectDeckPanel("projecteditor");
 
     this.getProjectEditor().then(() => {
       this.updateProjectEditorHeader();
     }, console.error);
-
-    if (project.location) {
-      Services.prefs.setCharPref("devtools.webide.lastprojectlocation", project.location);
-    }
   },
 
   /********** DECK **********/
 
   resetFocus: function() {
     document.commandDispatcher.focusedElement = document.documentElement;
   },
 
@@ -818,22 +859,21 @@ let Cmds = {
 
   showRuntimeDetails: function() {
     UI.selectDeckPanel("runtimedetails");
   },
 
   play: function() {
     switch(AppManager.selectedProject.type) {
       case "packaged":
+        return UI.busyWithProgressUntil(AppManager.installAndRunProject(), "installing and running app");
       case "hosted":
         return UI.busyUntil(AppManager.installAndRunProject(), "installing and running app");
-        break;
       case "runtimeApp":
         return UI.busyUntil(AppManager.runRuntimeApp(), "running app");
-        break;
     }
     return promise.reject();
   },
 
   stop: function() {
     return UI.busyUntil(AppManager.stopRunningApp(), "stopping app");
   },
 
--- a/browser/devtools/webide/content/webide.xul
+++ b/browser/devtools/webide/content/webide.xul
@@ -97,17 +97,20 @@
 
   <toolbar id="main-toolbar">
 
     <vbox flex="1">
       <hbox id="action-buttons-container" class="busy">
         <toolbarbutton id="action-button-play"  class="action-button" command="cmd_play" tooltiptext="&projectMenu_play_label;"/>
         <toolbarbutton id="action-button-stop"  class="action-button" command="cmd_stop" tooltiptext="&projectMenu_stop_label;"/>
         <toolbarbutton id="action-button-debug" class="action-button" command="cmd_toggleToolbox" tooltiptext="&projectMenu_debug_label;"/>
-        <html:img id="action-busy" src="chrome://webide/skin/throbber.svg"/>
+        <hbox id="action-busy" align="center">
+          <html:img id="action-busy-undetermined" src="chrome://webide/skin/throbber.svg"/>
+          <progressmeter id="action-busy-determined"/>
+        </hbox>
       </hbox>
 
       <hbox id="panel-buttons-container">
         <toolbarbutton id="project-panel-button" class="panel-button no-project" command="cmd_showProjectPanel">
           <image class="panel-button-image"/>
           <label class="panel-button-label" value="&projectButton_label;"/>
           <image class="panel-button-anchor"/>
         </toolbarbutton>
--- a/browser/devtools/webide/modules/app-manager.js
+++ b/browser/devtools/webide/modules/app-manager.js
@@ -54,21 +54,25 @@ exports.AppManager = AppManager = {
     };
     if (Services.prefs.getBoolPref("devtools.webide.enableLocalRuntime")) {
       this.runtimeList.custom.push(gLocalRuntime);
     }
     this.trackUSBRuntimes();
     this.trackWiFiRuntimes();
     this.trackSimulatorRuntimes();
 
+    this.onInstallProgress = this.onInstallProgress.bind(this);
+    AppActorFront.on("install-progress", this.onInstallProgress);
+
     this.observe = this.observe.bind(this);
     Services.prefs.addObserver(WIFI_SCANNING_PREF, this, false);
   },
 
   uninit: function() {
+    AppActorFront.off("install-progress", this.onInstallProgress);
     this._unlistenToApps();
     this.selectedProject = null;
     this.selectedRuntime = null;
     this.untrackUSBRuntimes();
     this.untrackWiFiRuntimes();
     this.untrackSimulatorRuntimes();
     this._runningApps.clear();
     this.runtimeList = null;
@@ -129,16 +133,20 @@ exports.AppManager = AppManager = {
         this._getRunningApps();
         this.update("list-tabs-response");
       });
     }
 
     this.update("connection");
   },
 
+  onInstallProgress: function(event, details) {
+    this.update("install-progress", details);
+  },
+
   onWebAppsStoreready: function() {
     this.update("runtime-apps-found");
   },
 
   _runningApps: new Set(),
   _getRunningApps: function() {
     let client = this.connection.client;
     if (!this._listTabsResponse.webappsActor) {
--- a/browser/devtools/webide/themes/webide.css
+++ b/browser/devtools/webide/themes/webide.css
@@ -16,23 +16,25 @@
   margin-top: -50px;
   pointer-events: none;
 }
 
 #panel-buttons-container > .panel-button {
   pointer-events: auto;
 }
 
-#action-busy {
+#action-busy-undetermined {
   height: 24px;
   width: 24px;
 }
 
 window.busy .action-button,
-window:not(.busy) #action-busy {
+window:not(.busy) #action-busy,
+window.busy-undetermined #action-busy-determined,
+window.busy-determined #action-busy-undetermined {
   display: none;
 }
 
 /* Panel buttons */
 
 .panel-button {
   -moz-appearance: none;
   -moz-box-align: center;
--- a/configure.in
+++ b/configure.in
@@ -3915,16 +3915,17 @@ if test -n "$MOZ_RTSP"; then
 fi
 USE_ARM_KUSER=
 BUILD_CTYPES=1
 MOZ_USE_NATIVE_POPUP_WINDOWS=
 MOZ_ANDROID_HISTORY=
 MOZ_WEBSMS_BACKEND=
 MOZ_ANDROID_BEAM=
 MOZ_LOCALE_SWITCHER=
+MOZ_ANDROID_SEARCH_ACTIVITY=
 ACCESSIBILITY=1
 MOZ_TIME_MANAGER=
 MOZ_PAY=
 MOZ_AUDIO_CHANNEL_MANAGER=
 NSS_NO_LIBPKIX=
 MOZ_CONTENT_SANDBOX=
 MOZ_CONTENT_SANDBOX_REPORTER=1
 JSGC_USE_EXACT_ROOTING=
@@ -4939,16 +4940,23 @@ fi
 dnl ========================================================
 dnl = Enable NFC permission on Android
 dnl ========================================================
 if test -n "$MOZ_ANDROID_BEAM"; then
     AC_DEFINE(MOZ_ANDROID_BEAM)
 fi
 
 dnl ========================================================
+dnl = Include Search Activity on Android
+dnl ========================================================
+if test -n "$MOZ_ANDROID_SEARCH_ACTIVITY"; then
+    AC_DEFINE(MOZ_ANDROID_SEARCH_ACTIVITY)
+fi
+
+dnl ========================================================
 dnl = Enable IPDL's "expensive" unit tests
 dnl ========================================================
 MOZ_IPDL_TESTS=
 
 MOZ_ARG_ENABLE_BOOL(ipdl-tests,
 [  --enable-ipdl-tests     Enable expensive IPDL tests],
     MOZ_IPDL_TESTS=1,
     MOZ_IPDL_TESTS=)
@@ -8466,16 +8474,17 @@ AC_SUBST(MOZ_D3DCOMPILER_XP_CAB)
 
 AC_SUBST(MOZ_METRO)
 
 AC_SUBST(MOZ_ANDROID_HISTORY)
 AC_SUBST(MOZ_WEBSMS_BACKEND)
 AC_SUBST(MOZ_ANDROID_BEAM)
 AC_SUBST(MOZ_LOCALE_SWITCHER)
 AC_SUBST(MOZ_DISABLE_GECKOVIEW)
+AC_SUBST(MOZ_ANDROID_SEARCH_ACTIVITY)
 AC_SUBST(ENABLE_STRIP)
 AC_SUBST(PKG_SKIP_STRIP)
 AC_SUBST(STRIP_FLAGS)
 AC_SUBST(USE_ELF_HACK)
 AC_SUBST(INCREMENTAL_LINKER)
 AC_SUBST(MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS)
 AC_SUBST(MOZ_COMPONENT_NSPR_LIBS)
 
--- a/dom/camera/FallbackCameraControl.cpp
+++ b/dom/camera/FallbackCameraControl.cpp
@@ -27,16 +27,18 @@ public:
   virtual nsresult Set(uint32_t aKey, const nsAString& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, nsAString& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Set(uint32_t aKey, double aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, double& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Set(uint32_t aKey, int32_t aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, int32_t& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Set(uint32_t aKey, int64_t aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, int64_t& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
+  virtual nsresult Set(uint32_t aKey, bool aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
+  virtual nsresult Get(uint32_t aKey, bool& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Set(uint32_t aKey, const Size& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, Size& aValue) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Set(uint32_t aKey, const nsTArray<Region>& aRegions) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual nsresult Get(uint32_t aKey, nsTArray<Region>& aRegions) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
 
   virtual nsresult SetLocation(const Position& aLocation) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
 
   virtual nsresult Get(uint32_t aKey, nsTArray<Size>& aSizes) MOZ_OVERRIDE { return NS_ERROR_NOT_IMPLEMENTED; }
--- a/dom/camera/GonkCameraControl.cpp
+++ b/dom/camera/GonkCameraControl.cpp
@@ -469,16 +469,29 @@ nsGonkCameraControl::Set(uint32_t aKey, 
 }
 
 nsresult
 nsGonkCameraControl::Get(uint32_t aKey, int64_t& aRet)
 {
   return mParams.Get(aKey, aRet);
 }
 
+// Boolean parameter accessors.
+nsresult
+nsGonkCameraControl::Set(uint32_t aKey, bool aValue)
+{
+  return SetAndPush(aKey, aValue);
+}
+
+nsresult
+nsGonkCameraControl::Get(uint32_t aKey, bool& aRet)
+{
+  return mParams.Get(aKey, aRet);
+}
+
 // Weighted-region parameter accessors.
 nsresult
 nsGonkCameraControl::Set(uint32_t aKey, const nsTArray<Region>& aRegions)
 {
   return SetAndPush(aKey, aRegions);
 }
 
 nsresult
--- a/dom/camera/GonkCameraControl.h
+++ b/dom/camera/GonkCameraControl.h
@@ -60,16 +60,18 @@ public:
   virtual nsresult Set(uint32_t aKey, const nsAString& aValue) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, nsAString& aValue) MOZ_OVERRIDE;
   virtual nsresult Set(uint32_t aKey, double aValue) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, double& aValue) MOZ_OVERRIDE;
   virtual nsresult Set(uint32_t aKey, int32_t aValue) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, int32_t& aValue) MOZ_OVERRIDE;
   virtual nsresult Set(uint32_t aKey, int64_t aValue) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, int64_t& aValue) MOZ_OVERRIDE;
+  virtual nsresult Set(uint32_t aKey, bool aValue) MOZ_OVERRIDE;
+  virtual nsresult Get(uint32_t aKey, bool& aValue) MOZ_OVERRIDE;
   virtual nsresult Set(uint32_t aKey, const Size& aValue) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, Size& aValue) MOZ_OVERRIDE;
   virtual nsresult Set(uint32_t aKey, const nsTArray<Region>& aRegions) MOZ_OVERRIDE;
   virtual nsresult Get(uint32_t aKey, nsTArray<Region>& aRegions) MOZ_OVERRIDE;
 
   virtual nsresult SetLocation(const Position& aLocation) MOZ_OVERRIDE;
 
   virtual nsresult Get(uint32_t aKey, nsTArray<Size>& aSizes) MOZ_OVERRIDE;
--- a/dom/camera/ICameraControl.h
+++ b/dom/camera/ICameraControl.h
@@ -201,16 +201,18 @@ public:
   virtual nsresult Set(uint32_t aKey, const nsAString& aValue) = 0;
   virtual nsresult Get(uint32_t aKey, nsAString& aValue) = 0;
   virtual nsresult Set(uint32_t aKey, double aValue) = 0;
   virtual nsresult Get(uint32_t aKey, double& aValue) = 0;
   virtual nsresult Set(uint32_t aKey, int32_t aValue) = 0;
   virtual nsresult Get(uint32_t aKey, int32_t& aValue) = 0;
   virtual nsresult Set(uint32_t aKey, int64_t aValue) = 0;
   virtual nsresult Get(uint32_t aKey, int64_t& aValue) = 0;
+  virtual nsresult Set(uint32_t aKey, bool aValue) = 0;
+  virtual nsresult Get(uint32_t aKey, bool& aValue) = 0;
   virtual nsresult Set(uint32_t aKey, const Size& aValue) = 0;
   virtual nsresult Get(uint32_t aKey, Size& aValue) = 0;
   virtual nsresult Set(uint32_t aKey, const nsTArray<Region>& aRegions) = 0;
   virtual nsresult Get(uint32_t aKey, nsTArray<Region>& aRegions) = 0;
 
   virtual nsresult SetLocation(const Position& aLocation) = 0;
 
   virtual nsresult Get(uint32_t aKey, nsTArray<Size>& aSizes) = 0;
--- a/dom/mobileconnection/tests/marionette/manifest.ini
+++ b/dom/mobileconnection/tests/marionette/manifest.ini
@@ -11,16 +11,17 @@ qemu = true
 [test_mobile_operator_names_roaming.js]
 [test_mobile_preferred_network_type.js]
 [test_mobile_preferred_network_type_radio_off.js]
 [test_mobile_data_connection.js]
 [test_mobile_data_location.js]
 [test_mobile_data_state.js]
 [test_mobile_mmi.js]
 [test_mobile_mmi_change_pin.js]
+[test_mobile_mmi_call_forwarding.js]
 [test_mobile_roaming_preference.js]
 [test_call_barring_get_option.js]
 [test_call_barring_set_error.js]
 [test_call_barring_change_password.js]
 [test_mobile_set_radio.js]
 [test_mobile_last_known_network.js]
 [test_mobile_icc_change.js]
 [test_mobile_connections_array_uninitialized.js]
new file mode 100644
--- /dev/null
+++ b/dom/mobileconnection/tests/marionette/test_mobile_mmi_call_forwarding.js
@@ -0,0 +1,145 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+MARIONETTE_TIMEOUT = 60000;
+MARIONETTE_HEAD_JS = "head.js";
+
+const TEST_DATA = [
+  {
+    reason: MozMobileConnection.CALL_FORWARD_REASON_UNCONDITIONAL,
+    number: "+886912345678",
+    serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
+    timeSeconds: 5
+  }, {
+    reason: MozMobileConnection.CALL_FORWARD_REASON_MOBILE_BUSY,
+    number: "0912345678",
+    serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
+    timeSeconds: 10
+  }, {
+    reason: MozMobileConnection.CALL_FORWARD_REASON_NO_REPLY,
+    number: "+886987654321",
+    serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
+    timeSeconds: 15
+  }, {
+    reason: MozMobileConnection.CALL_FORWARD_REASON_NOT_REACHABLE,
+    number: "+0987654321",
+    serviceClass: MozMobileConnection.ICC_SERVICE_CLASS_VOICE,
+    timeSeconds: 20
+  }
+];
+
+// Please see TS 22.030 Annex B
+const CF_REASON_TO_MMI = {
+  /* CALL_FORWARD_REASON_UNCONDITIONAL */
+  0: "21",
+  /* CALL_FORWARD_REASON_MOBILE_BUSY */
+  1: "67",
+  /* CALL_FORWARD_REASON_NO_REPLY */
+  2: "61",
+  /* CALL_FORWARD_REASON_NOT_REACHABLE */
+  3: "62",
+  /* CALL_FORWARD_REASON_ALL_CALL_FORWARDING */
+  4: "002",
+  /* CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING */
+  5: "004"
+};
+
+// Please see TS 22.030 Annex C
+const SERVICE_CLASS_TO_MMI = {
+  /* ICC_SERVICE_CLASS_VOICE */
+  1: "11"
+};
+
+function testSetCallForwarding(aData) {
+  // Registration: **SC*SIA*SIB*SIC#
+  let MMI_CODE = "**" + CF_REASON_TO_MMI[aData.reason] + "*" + aData.number +
+                 "*" + SERVICE_CLASS_TO_MMI[aData.serviceClass] +
+                 "*" + aData.timeSeconds + "#";
+  log("Test " + MMI_CODE);
+
+  let promises = [];
+  // Check cfstatechange event.
+  promises.push(waitForManagerEvent("cfstatechange").then(function(aEvent) {
+    is(aEvent.success, true, "check success");
+    is(aEvent.action, MozMobileConnection.CALL_FORWARD_ACTION_REGISTRATION,
+       "check action");
+    is(aEvent.reason, aData.reason, "check reason");
+    is(aEvent.number, aData.number, "check number");
+    is(aEvent.timeSeconds, aData.timeSeconds, "check timeSeconds");
+    is(aEvent.serviceClass, aData.serviceClass, "check serviceClass");
+  }));
+  // Check DOMRequest's result.
+  promises.push(sendMMI(MMI_CODE)
+    .then(function resolve(aResult) {
+      is(aResult.serviceCode, "scCallForwarding", "Check service code");
+      is(aResult.statusMessage, "smServiceRegistered", "Check status message");
+      is(aResult.additionalInformation, undefined, "Check additional information");
+    }, function reject(aError) {
+      ok(false, "got '" + aError.name + "' error");
+    }));
+
+  return Promise.all(promises);
+}
+
+function testGetCallForwarding(aExpectedData) {
+  // Interrogation: *#SC#
+  let MMI_CODE = "*#" + CF_REASON_TO_MMI[aExpectedData.reason] + "#";
+  log("Test " + MMI_CODE);
+
+  return sendMMI(MMI_CODE)
+    .then(function resolve(aResult) {
+      is(aResult.serviceCode, "scCallForwarding", "Check service code");
+      is(aResult.statusMessage, "smServiceInterrogated", "Check status message");
+      is(Array.isArray(aResult.additionalInformation), true,
+         "additionalInformation should be an array");
+
+      for (let i = 0; i < aResult.additionalInformation.length; i++) {
+        let result = aResult.additionalInformation[i];
+
+        // Only need to check the result containing the serviceClass that we are
+        // interested in.
+        if (!(result.serviceClass & aExpectedData.serviceClass)) {
+          continue;
+        }
+
+        is(result.active, true, "check active");
+        is(result.reason, aExpectedData.reason, "check reason");
+        is(result.number, aExpectedData.number, "check number");
+        is(result.timeSeconds, aExpectedData.timeSeconds, "check timeSeconds");
+      }
+    }, function reject(aError) {
+      ok(false, MMI_CODE + " got error: " + aError.name);
+    });
+}
+
+function clearAllCallForwardingSettings() {
+  log("Clear all call forwarding settings");
+
+  let promise = Promise.resolve();
+  for (let reason = MozMobileConnection.CALL_FORWARD_REASON_UNCONDITIONAL;
+       reason <= MozMobileConnection.CALL_FORWARD_REASON_ALL_CONDITIONAL_CALL_FORWARDING;
+       reason++) {
+    let options = {
+      reason: reason,
+      action: MozMobileConnection.CALL_FORWARD_ACTION_ERASURE
+    };
+    // Emulator doesn't support CALL_FORWARD_REASON_ALL_* yet, we catch the
+    // reject here in order to avoid impact the test result.
+    promise =
+      promise.then(() => setCallForwardingOption(options).then(null, () => {}));
+  }
+  return promise;
+}
+
+// Start tests
+startTestCommon(function() {
+  let promise = Promise.resolve();
+  for (let i = 0; i < TEST_DATA.length; i++) {
+    let data = TEST_DATA[i];
+    promise = promise.then(() => testSetCallForwarding(data))
+                     .then(() => testGetCallForwarding(data));
+  }
+  // reset call forwarding settings.
+  return promise.then(null, () => { ok(false, "promise reject during test"); })
+    .then(() => clearAllCallForwardingSettings());
+});
--- a/dom/system/NetworkGeolocationProvider.js
+++ b/dom/system/NetworkGeolocationProvider.js
@@ -238,20 +238,25 @@ WifiGeoPositionProvider.prototype = {
                     .getService(Ci.nsIRadioInterfaceLayer);
       let numInterfaces = radioService.numRadioInterfaces;
       let result = [];
       for (let i = 0; i < numInterfaces; i++) {
         LOG("Looking for SIM in slot:" + i + " of " + numInterfaces);
         let radio = radioService.getRadioInterface(i);
         let iccInfo = radio.rilContext.iccInfo;
         let cell = radio.rilContext.voice.cell;
+        let type = radio.rilContext.voice.type;
 
-        if (iccInfo && cell) {
-          // TODO type and signal strength
-          result.push({ radio: "gsm",
+        if (iccInfo && cell && type) {
+          if (type === "gsm" || type === "gprs" || type === "edge") {
+            type = "gsm";
+          } else {
+            type = "wcdma";
+          }
+          result.push({ radio: type,
                       mobileCountryCode: iccInfo.mcc,
                       mobileNetworkCode: iccInfo.mnc,
                       locationAreaCode: cell.gsmLocationAreaCode,
                       cellId: cell.gsmCellId });
         }
       }
       return result;
     } catch (e) {
--- a/mobile/android/base/AndroidManifest.xml.in
+++ b/mobile/android/base/AndroidManifest.xml.in
@@ -12,16 +12,20 @@
     <uses-sdk android:minSdkVersion="8"
               android:targetSdkVersion="@ANDROID_TARGET_SDK@"/>
 
 #include ../services/manifests/AnnouncementsAndroidManifest_permissions.xml.in
 #include ../services/manifests/FxAccountAndroidManifest_permissions.xml.in
 #include ../services/manifests/HealthReportAndroidManifest_permissions.xml.in
 #include ../services/manifests/SyncAndroidManifest_permissions.xml.in
 
+#ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+#include ../search/manifests/SearchAndroidManifest_permissions.xml.in
+#endif
+
 #ifndef RELEASE_BUILD
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 #endif
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
@@ -301,16 +305,19 @@
             <action android:name="org.mozilla.gecko.restart_update"/>
           </intent-filter>
         </activity>
 
 #include ../services/manifests/AnnouncementsAndroidManifest_activities.xml.in
 #include ../services/manifests/FxAccountAndroidManifest_activities.xml.in
 #include ../services/manifests/HealthReportAndroidManifest_activities.xml.in
 #include ../services/manifests/SyncAndroidManifest_activities.xml.in
+#ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+#include ../search/manifests/SearchAndroidManifest_activities.xml.in
+#endif
 
 #if MOZ_CRASHREPORTER
   <activity android:name="org.mozilla.gecko.CrashReporter"
             android:label="@string/crash_reporter_title"
             android:icon="@drawable/crash_reporter"
             android:theme="@style/Gecko"
             android:exported="false"
             android:excludeFromRecents="true">
@@ -392,16 +399,19 @@
             android:name="org.mozilla.gecko.NotificationService">
         </service>
 
 
 #include ../services/manifests/AnnouncementsAndroidManifest_services.xml.in
 #include ../services/manifests/FxAccountAndroidManifest_services.xml.in
 #include ../services/manifests/HealthReportAndroidManifest_services.xml.in
 #include ../services/manifests/SyncAndroidManifest_services.xml.in
+#ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+#include ../search/manifests/SearchAndroidManifest_services.xml.in
+#endif
 
     </application>
 
     <permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
                 android:protectionLevel="signature"/>
 
     <permission android:name="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"
                 android:protectionLevel="signature"/>
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -86,16 +86,22 @@ ALL_JARS = \
   sync-thirdparty.jar \
   websockets.jar \
   $(NULL)
 
 ifdef MOZ_WEBRTC
 ALL_JARS += webrtc.jar
 endif
 
+ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+extra_packages += org.mozilla.search
+ALL_JARS += search-activity.jar
+generated/org/mozilla/search/R.java: .aapt.deps ;
+endif
+
 include $(topsrcdir)/config/config.mk
 
 # Note that we're going to set up a dependency directly between embed_android.dex and the java files
 # Instead of on the .class files, since more than one .class file might be produced per .java file
 # Sync dependencies are provided in a single jar. Sync classes themselves are delivered as source,
 # because Android resource classes must be compiled together in order to avoid overlapping resource
 # indices.
 
--- a/mobile/android/base/locales/Makefile.in
+++ b/mobile/android/base/locales/Makefile.in
@@ -3,16 +3,21 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 include $(topsrcdir)/config/config.mk
 
 # special case some locale codes, he and id
 # http://code.google.com/p/android/issues/detail?id=3639
 AB_rCD = $(if $(filter he, $(AB_CD)),iw,$(if $(filter id, $(AB_CD)),in,$(subst -,-r,$(AB_CD))))
 
+# The search strings path is always passed to strings.xml.in; the
+# decision to include is made based on the feature flag at the
+# inclusion site.
+SEARCHSTRINGSPATH = $(srcdir)/../../search/strings/search_strings.dtd
+
 SYNCSTRINGSPATH = $(abspath $(call MERGE_FILE,sync_strings.dtd))
 STRINGSPATH = $(abspath $(call MERGE_FILE,android_strings.dtd))
 ifeq (,$(XPI_NAME))
 BRANDPATH = $(abspath $(DEPTH)/dist/bin/chrome/$(AB_CD)/locale/branding/brand.dtd)
 else
 BRANDPATH = $(abspath $(DIST)/xpi-stage/$(XPI_NAME)/chrome/$(AB_CD)/locale/branding/brand.dtd)
 endif
 $(warnIfEmpty,AB_CD) # todo: $(errorIfEmpty )
@@ -62,16 +67,17 @@ ifeq (,$(strip $(strings-xml-bypath)))
   strings-xml-bypath = $(strings-xml)
 endif
 dir-strings-xml = $(patsubst %/,%,$(dir $(strings-xml-bypath)))
 
 strings-xml-preqs =\
   $(strings-xml-in) \
   $(BRANDPATH) \
   $(STRINGSPATH) \
+  $(SEARCHSTRINGSPATH) \
   $(SYNCSTRINGSPATH) \
   $(BOOKMARKSPATH) \
   $(if $(IS_LANGUAGE_REPACK),FORCE) \
   $(NULL)
 
 $(if $(MOZ_ANDROID_SHARED_ACCOUNT_TYPE),,$(error Missing MOZ_ANDROID_SHARED_ACCOUNT_TYPE))
 $(if $(MOZ_ANDROID_SHARED_FXACCOUNT_TYPE),,$(error Missing MOZ_ANDROID_SHARED_FXACCOUNT_TYPE))
 
@@ -81,16 +87,17 @@ strings-xml-preqs =\
 	  -DANDROID_PACKAGE_NAME=$(ANDROID_PACKAGE_NAME) \
 	  -DBOOKMARKSPATH='$(BOOKMARKSPATH)' \
 	  -DBRANDPATH='$(BRANDPATH)' \
 	  -DMOZ_ANDROID_SHARED_ACCOUNT_TYPE=$(MOZ_ANDROID_SHARED_ACCOUNT_TYPE) \
 	  -DMOZ_ANDROID_SHARED_FXACCOUNT_TYPE=$(MOZ_ANDROID_SHARED_FXACCOUNT_TYPE) \
 	  -DMOZ_APP_DISPLAYNAME='@MOZ_APP_DISPLAYNAME@' \
 	  -DSTRINGSPATH='$(STRINGSPATH)' \
 	  -DSYNCSTRINGSPATH='$(SYNCSTRINGSPATH)' \
+	  -DSEARCHSTRINGSPATH='$(SEARCHSTRINGSPATH)' \
       $< \
 	  -o $@)
 
 suggestedsites-srcdir := $(if $(filter en-US,$(AB_CD)),,$(or $(realpath $(L10NBASEDIR)),$(abspath $(L10NBASEDIR)))/$(AB_CD)/mobile/chrome)
 
 # Determine the ../res/raw[-*] path.  This can be ../res/raw when no
 # locale is explicitly specified.
 suggestedsites-json-bypath = $(filter %/suggestedsites.json,$(MAKECMDGOALS))
--- a/mobile/android/base/locales/moz.build
+++ b/mobile/android/base/locales/moz.build
@@ -1,6 +1,8 @@
 # -*- 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/.
 
+if CONFIG['MOZ_ANDROID_SEARCH_ACTIVITY']:
+    DEFINES['MOZ_ANDROID_SEARCH_ACTIVITY'] = 1
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -522,17 +522,18 @@ ANDROID_RES_DIRS += [
     OBJDIR + '/res',
 ]
 
 ANDROID_GENERATED_RESFILES += [
     'res/raw/suggestedsites.json',
     'res/values/strings.xml',
 ]
 
-for var in ('MOZ_ANDROID_ANR_REPORTER', 'MOZ_LINKER_EXTRACT', 'MOZILLA_OFFICIAL', 'MOZ_DEBUG'):
+for var in ('MOZ_ANDROID_ANR_REPORTER', 'MOZ_LINKER_EXTRACT', 'MOZILLA_OFFICIAL', 'MOZ_DEBUG',
+            'MOZ_ANDROID_SEARCH_ACTIVITY'):
     if CONFIG[var]:
         DEFINES[var] = 1
 
 for var in ('MOZ_UPDATER', 'MOZ_PKG_SPECIAL'):
     if CONFIG[var]:
         DEFINES[var] = CONFIG[var]
 
 for var in ('ANDROID_PACKAGE_NAME', 'ANDROID_CPU_ARCH', 'CPU_ARCH',
@@ -547,16 +548,36 @@ for var in ('ANDROID_PACKAGE_NAME', 'AND
 DEFINES['MANGLED_ANDROID_PACKAGE_NAME'] = CONFIG['ANDROID_PACKAGE_NAME'].replace('fennec', 'f3nn3c')
 DEFINES['MOZ_APP_ABI'] = CONFIG['TARGET_XPCOM_ABI']
 
 if '-march=armv7' in CONFIG['OS_CFLAGS']:
     DEFINES['MOZ_MIN_CPU_VERSION'] = 7
 else:
     DEFINES['MOZ_MIN_CPU_VERSION'] = 5
 
+if CONFIG['MOZ_ANDROID_SEARCH_ACTIVITY']:
+    # The Search Activity is mostly independent of Fennec proper, but
+    # it does depend on Geckoview.  Therefore, we build it as a jar
+    # that depends on the Geckoview jars.
+    search_source_dir = SRCDIR + '/../search'
+    include('../search/search_activity_sources.mozbuild')
+
+    ANDROID_RES_DIRS += [search_source_dir + '/res']
+    resjar.generated_sources += ['org/mozilla/search/R.java']
+
+    search_activity = add_java_jar('search-activity')
+    search_activity.sources += [search_source_dir + '/' + f for f in search_activity_sources]
+    search_activity.javac_flags += ['-Xlint:all']
+    search_activity.extra_jars = [
+        'gecko-R.jar',
+        'gecko-browser.jar',
+        'gecko-mozglue.jar',
+        'gecko-util.jar',
+    ]
+
 generated_recursive_make_targets = ['.aapt.deps', '.locales.deps'] # Captures dependencies on Android manifest and all resources.
 
 generated = add_android_eclipse_library_project('FennecResourcesGenerated')
 generated.package_name = 'org.mozilla.fennec.resources.generated'
 generated.res = OBJDIR + '/res'
 generated.recursive_make_targets += generated_recursive_make_targets
 
 branding = add_android_eclipse_library_project('FennecResourcesBranding')
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -3,16 +3,19 @@
 <!-- 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/. -->
 
 <!DOCTYPE resources [
 #includesubst @BRANDPATH@
 #includesubst @STRINGSPATH@
 #includesubst @SYNCSTRINGSPATH@
+#ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+#includesubst @SEARCHSTRINGSPATH@
+#endif
 
 <!-- C-style format strings. -->
 <!ENTITY formatI "&#037;I">
 <!ENTITY formatS "&#037;s">
 <!ENTITY formatS1 "&#037;1&#036;s">
 <!ENTITY formatS2 "&#037;2&#036;s">
 <!ENTITY formatS3 "&#037;3&#036;s">
 <!ENTITY formatD "&#037;d">
@@ -24,16 +27,21 @@
   <string name="android_package_name">@ANDROID_PACKAGE_NAME@</string>
   <string name="content_authority_db_browser">@ANDROID_PACKAGE_NAME@.db.browser</string>
   <string name="content_authority_db_formhistory">@ANDROID_PACKAGE_NAME@.db.formhistory</string>
   <string name="content_authority_db_passwords">@ANDROID_PACKAGE_NAME@.db.passwords</string>
   <string name="content_authority_db_tabs">@ANDROID_PACKAGE_NAME@.db.tabs</string>
   <string name="moz_android_shared_account_type">@MOZ_ANDROID_SHARED_ACCOUNT_TYPE@</string>
   <string name="moz_android_shared_fxaccount_type">@MOZ_ANDROID_SHARED_FXACCOUNT_TYPE@</string>
   <string name="android_package_name_for_ui">@ANDROID_PACKAGE_NAME@</string>
+
+#ifdef MOZ_ANDROID_SEARCH_ACTIVITY
+#include ../search/strings/search_strings.xml.in
+#endif
+
 #include ../services/strings.xml.in
   <string name="no_space_to_start_error">&no_space_to_start_error;</string>
   <string name="error_loading_file">&error_loading_file;</string>
 
   <string name="bookmarks_title">&bookmarks_title;</string>
   <string name="history_title">&history_title;</string>
   <string name="reading_list_title">&reading_list_title;</string>
   <string name="recent_tabs_title">&recent_tabs_title;</string>
--- a/mobile/android/base/toolbar/ToolbarEditText.java
+++ b/mobile/android/base/toolbar/ToolbarEditText.java
@@ -363,16 +363,22 @@ public class ToolbarEditText extends Cus
 
         return new InputConnectionWrapper(ic, false) {
             @Override
             public boolean deleteSurroundingText(final int beforeLength, final int afterLength) {
                 if (removeAutocomplete(getText())) {
                     // If we have autocomplete text, the cursor is at the boundary between
                     // regular and autocomplete text. So regardless of which direction we
                     // are deleting, we should delete the autocomplete text first.
+                    // Make the IME aware that we interrupted the deleteSurroundingText call,
+                    // by restarting the IME.
+                    final InputMethodManager imm = InputMethods.getInputMethodManager(mContext);
+                    if (imm != null) {
+                        imm.restartInput(ToolbarEditText.this);
+                    }
                     return false;
                 }
                 return super.deleteSurroundingText(beforeLength, afterLength);
             }
 
             private boolean removeAutocompleteOnComposing(final CharSequence text) {
                 final Editable editable = getText();
                 final int composingStart = BaseInputConnection.getComposingSpanStart(editable);
@@ -381,16 +387,19 @@ public class ToolbarEditText extends Cus
                 // i.e. when the composing text is getting shorter.
                 if (composingStart >= 0 &&
                     composingEnd >= 0 &&
                     (composingEnd - composingStart) > text.length() &&
                     removeAutocomplete(editable)) {
                     // Make the IME aware that we interrupted the setComposingText call,
                     // by having finishComposingText() send change notifications to the IME.
                     finishComposingText();
+                    if (Build.VERSION.SDK_INT >= 9) {
+                        setComposingRegion(composingStart, composingEnd);
+                    }
                     return true;
                 }
                 return false;
             }
 
             @Override
             public boolean commitText(CharSequence text, int newCursorPosition) {
                 if (removeAutocompleteOnComposing(text)) {
--- a/mobile/android/confvars.sh
+++ b/mobile/android/confvars.sh
@@ -69,8 +69,11 @@ fi
 # Enable runtime locale switching.
 MOZ_LOCALE_SWITCHER=1
 
 # Enable second screen and casting support for external devices.
 MOZ_DEVICES=1
 
 # Enable second screen using native Android libraries
 MOZ_NATIVE_DEVICES=
+
+# Don't enable the Search Activity.
+# MOZ_ANDROID_SEARCH_ACTIVITY=1
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/Constants.java
@@ -0,0 +1,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/.
+ */
+
+/* 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/. */
+
+package org.mozilla.search;
+
+/**
+ * Key should not be stored here. For more info on storing keys, see
+ * https://github.com/ericedens/FirefoxSearch/issues/3
+ */
+public class Constants {
+    public static final String AUTO_COMPLETE_FRAGMENT = "org.mozilla.search.AUTO_COMPLETE_FRAGMENT";
+    public static final String CARD_STREAM_FRAGMENT = "org.mozilla.search.CARD_STREAM_FRAGMENT";
+    public static final String GECKO_VIEW_FRAGMENT = "org.mozilla.search.GECKO_VIEW_FRAGMENT";
+
+    public static final String AUTOCOMPLETE_ROW_LIMIT = "5";
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/DetailActivity.java
@@ -0,0 +1,100 @@
+/* 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/. */
+
+package org.mozilla.search;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.mozilla.gecko.GeckoView;
+import org.mozilla.gecko.GeckoViewChrome;
+import org.mozilla.gecko.GeckoViewContent;
+import org.mozilla.gecko.PrefsHelper;
+
+public class DetailActivity extends Fragment {
+
+    private static final String LOGTAG = "DetailActivity";
+    private GeckoView geckoView;
+
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        View mainView = inflater.inflate(R.layout.search_activity_detail, container, false);
+
+
+        geckoView = (GeckoView) mainView.findViewById(R.id.gecko_view);
+
+        geckoView.setChromeDelegate(new MyGeckoViewChrome());
+        geckoView.setContentDelegate(new SearchGeckoView());
+
+        PrefsHelper.setPref("privacy.clearOnShutdown.cache", true);
+        PrefsHelper.setPref("privacy.clearOnShutdown.cookies", true);
+
+
+        if (null == geckoView.getCurrentBrowser()) {
+            // This pageload allows Fennec to be loaded in a background fragment.
+            // Without supplying a URL, it doesn't look like Fennec will get loaded?
+            geckoView.addBrowser("https://search.yahoo.com/search?p=firefox%20android");
+
+        }
+
+        return mainView;
+    }
+
+
+    public void setUrl(String url) {
+        if (null == geckoView.getCurrentBrowser()) {
+            geckoView.addBrowser(url);
+        } else {
+            geckoView.getCurrentBrowser().loadUrl(url);
+        }
+    }
+
+
+    private static class MyGeckoViewChrome extends GeckoViewChrome {
+        @Override
+        public void onReady(GeckoView view) {
+            Log.i(LOGTAG, "Gecko is ready");
+
+            PrefsHelper.setPref("devtools.debugger.remote-enabled", true);
+
+            // The Gecko libraries have finished loading and we can use the rendering engine.
+            // Let's add a browser (required) and load a page into it.
+        }
+
+    }
+
+
+    private class SearchGeckoView extends GeckoViewContent {
+
+        @Override
+        public void onPageStart(GeckoView geckoView, GeckoView.Browser browser, String s) {
+            Log.i("OnPageStart", s);
+            // Only load this page if it's the Yahoo search page that we're using.
+            // TODO: Make this check more robust, and allow for other search providers.
+            if (s.contains("//search.yahoo.com")) {
+                super.onPageStart(geckoView, browser, s);
+
+
+            } else {
+                browser.stop();
+                Intent i = new Intent(Intent.ACTION_VIEW);
+                i.setData(Uri.parse(s));
+                startActivity(i);
+            }
+        }
+
+        @Override
+        public void onPageShow(GeckoView geckoView, GeckoView.Browser browser) {
+
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/MainActivity.java
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.search;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import org.mozilla.search.autocomplete.AcceptsSearchQuery;
+import org.mozilla.search.autocomplete.AutoCompleteFragment;
+import org.mozilla.search.stream.CardStreamFragment;
+
+
+/**
+ * The main entrance for the Android search intent.
+ * <p/>
+ * State management is delegated to child fragments. Fragments communicate
+ * with each other by passing messages through this activity. The only message passing right
+ * now, the only message passing occurs when a user wants to submit a search query. That
+ * passes through the onSearch method here.
+ */
+public class MainActivity extends FragmentActivity implements AcceptsSearchQuery,
+        FragmentManager.OnBackStackChangedListener {
+
+    private DetailActivity detailActivity;
+
+    @Override
+    protected void onCreate(Bundle stateBundle) {
+        super.onCreate(stateBundle);
+
+        // Sets the content view for the Activity
+        setContentView(R.layout.search_activity_main);
+
+        // Gets an instance of the support library FragmentManager
+        FragmentManager localFragmentManager = getSupportFragmentManager();
+
+        // If the incoming state of the Activity is null, sets the initial view to be thumbnails
+        if (null == stateBundle) {
+
+            // Starts a Fragment transaction to track the stack
+            FragmentTransaction localFragmentTransaction = localFragmentManager.beginTransaction();
+
+            localFragmentTransaction.add(R.id.header_fragments, new AutoCompleteFragment(),
+                    Constants.AUTO_COMPLETE_FRAGMENT);
+
+            localFragmentTransaction.add(R.id.presearch_fragments, new CardStreamFragment(),
+                    Constants.CARD_STREAM_FRAGMENT);
+
+            // Commits this transaction to display the Fragment
+            localFragmentTransaction.commit();
+
+            // The incoming state of the Activity isn't null.
+        }
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+
+
+        if (null == detailActivity) {
+            detailActivity = new DetailActivity();
+        }
+
+        if (null == getSupportFragmentManager().findFragmentByTag(Constants.GECKO_VIEW_FRAGMENT)) {
+            FragmentTransaction txn = getSupportFragmentManager().beginTransaction();
+            txn.add(R.id.gecko_fragments, detailActivity, Constants.GECKO_VIEW_FRAGMENT);
+            txn.hide(detailActivity);
+
+            txn.commit();
+        }
+    }
+
+    @Override
+    public void onSearch(String s) {
+        FragmentManager localFragmentManager = getSupportFragmentManager();
+        FragmentTransaction localFragmentTransaction = localFragmentManager.beginTransaction();
+
+        localFragmentTransaction
+                .hide(localFragmentManager.findFragmentByTag(Constants.CARD_STREAM_FRAGMENT))
+                .addToBackStack(null);
+
+        localFragmentTransaction
+                .show(localFragmentManager.findFragmentByTag(Constants.GECKO_VIEW_FRAGMENT))
+                .addToBackStack(null);
+
+        localFragmentTransaction.commit();
+
+
+        ((DetailActivity) getSupportFragmentManager()
+                .findFragmentByTag(Constants.GECKO_VIEW_FRAGMENT))
+                .setUrl("https://search.yahoo.com/search?p=" + Uri.encode(s));
+    }
+
+    @Override
+    public void onBackStackChanged() {
+
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AcceptsJumpTaps.java
@@ -0,0 +1,15 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+/**
+ * Allows rows to pass a "jump" event to the parent fragment.
+ * <p/>
+ * A jump event is when a user selects a suggestion, but they'd like to continue
+ * searching. Right now, the UI uses an arrow that points up and to the left.
+ */
+interface AcceptsJumpTaps {
+    public void onJumpTap(String suggestion);
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AcceptsSearchQuery.java
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.search.autocomplete;
+
+
+/**
+ * Allows rows to pass a search event to the parent fragment.
+ */
+public interface AcceptsSearchQuery {
+    void onSearch(String s);
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteAdapter.java
@@ -0,0 +1,45 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+
+/**
+ * The adapter that is used to populate the autocomplete rows.
+ */
+class AutoCompleteAdapter extends ArrayAdapter<AutoCompleteModel> {
+
+    private final AcceptsJumpTaps acceptsJumpTaps;
+
+    public AutoCompleteAdapter(Context context, AcceptsJumpTaps acceptsJumpTaps) {
+        // Uses '0' for the template id since we are overriding getView
+        // and supplying our own view.
+        super(context, 0);
+        this.acceptsJumpTaps = acceptsJumpTaps;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        AutoCompleteRowView view;
+
+        if (convertView == null) {
+            view = new AutoCompleteRowView(getContext());
+        } else {
+            view = (AutoCompleteRowView) convertView;
+        }
+
+        view.setOnJumpListener(acceptsJumpTaps);
+
+
+        AutoCompleteModel model = getItem(position);
+
+        view.setMainText(model.getMainText());
+
+        return view;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteAgentManager.java
@@ -0,0 +1,84 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+import android.app.Activity;
+import android.database.Cursor;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+/**
+ * A single entry point for querying all agents.
+ * <p/>
+ * An agent is responsible for querying some underlying data source. It could be a
+ * flat file, or a REST endpoint, or a content provider.
+ */
+class AutoCompleteAgentManager {
+
+    private final Handler mainUiHandler;
+    private final Handler localHandler;
+    private final AutoCompleteWordListAgent autoCompleteWordListAgent;
+
+    public AutoCompleteAgentManager(Activity activity, Handler mainUiHandler) {
+        HandlerThread thread = new HandlerThread("org.mozilla.search.autocomplete.SuggestionAgent");
+        // TODO: Where to kill this thread?
+        thread.start();
+        Log.i("AUTOCOMPLETE", "Starting thread");
+        this.mainUiHandler = mainUiHandler;
+        localHandler = new SuggestionMessageHandler(thread.getLooper());
+        autoCompleteWordListAgent = new AutoCompleteWordListAgent(activity);
+    }
+
+    /**
+     * Process the next incoming query.
+     */
+    public void search(String queryString) {
+        // TODO check if there's a pending search.. not sure how to handle that.
+        localHandler.sendMessage(localHandler.obtainMessage(0, queryString));
+    }
+
+    /**
+     * This background thread runs the queries; the results get sent back through mainUiHandler
+     * <p/>
+     * TODO: Refactor this wordlist search and add other search providers (eg: Yahoo)
+     */
+    private class SuggestionMessageHandler extends Handler {
+
+        private SuggestionMessageHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            if (null == msg.obj) {
+                return;
+            }
+
+            Cursor cursor =
+                    autoCompleteWordListAgent.getWordMatches(((String) msg.obj).toLowerCase());
+            ArrayList<AutoCompleteModel> res = new ArrayList<AutoCompleteModel>();
+
+            if (null == cursor) {
+                return;
+            }
+
+            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
+                res.add(new AutoCompleteModel(cursor.getString(
+                        cursor.getColumnIndex(AutoCompleteWordListAgent.COL_WORD))));
+            }
+
+
+            mainUiHandler.sendMessage(Message.obtain(mainUiHandler, 0, res));
+        }
+
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteFragment.java
@@ -0,0 +1,276 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.FrameLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import org.mozilla.search.R;
+
+/**
+ * A fragment to handle autocomplete. Its interface with the outside
+ * world should be very very limited.
+ * <p/>
+ * TODO: Add clear button to search input
+ * TODO: Add more search providers (other than the dictionary)
+ */
+public class AutoCompleteFragment extends Fragment implements AdapterView.OnItemClickListener,
+        TextView.OnEditorActionListener, AcceptsJumpTaps {
+
+    private View mainView;
+    private FrameLayout backdropFrame;
+    private EditText searchBar;
+    private ListView suggestionDropdown;
+    private InputMethodManager inputMethodManager;
+    private AutoCompleteAdapter autoCompleteAdapter;
+    private AutoCompleteAgentManager autoCompleteAgentManager;
+    private State state;
+
+    private enum State {
+        WAITING,  // The user is doing something else in the app.
+        RUNNING   // The user is in search mode.
+    }
+
+    public AutoCompleteFragment() {
+        // Required empty public constructor
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+
+
+        mainView = inflater.inflate(R.layout.search_auto_complete, container, false);
+        backdropFrame = (FrameLayout) mainView.findViewById(R.id.auto_complete_backdrop);
+        searchBar = (EditText) mainView.findViewById(R.id.auto_complete_search_bar);
+        suggestionDropdown = (ListView) mainView.findViewById(R.id.auto_complete_dropdown);
+
+        inputMethodManager =
+                (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+
+        // Attach a listener for the "search" key on the keyboard.
+        searchBar.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                autoCompleteAgentManager.search(s.toString());
+            }
+        });
+        searchBar.setOnEditorActionListener(this);
+        searchBar.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (v.hasFocus()) {
+                    return;
+                }
+                transitionToRunning();
+            }
+        });
+
+        backdropFrame.setOnClickListener(new BackdropClickListener());
+
+        autoCompleteAdapter = new AutoCompleteAdapter(getActivity(), this);
+
+        // Disable notifying on change. We're going to be changing the entire dataset, so
+        // we don't want multiple re-draws.
+        autoCompleteAdapter.setNotifyOnChange(false);
+
+        suggestionDropdown.setAdapter(autoCompleteAdapter);
+
+        initRows();
+
+        autoCompleteAgentManager =
+                new AutoCompleteAgentManager(getActivity(), new MainUiHandler(autoCompleteAdapter));
+
+        // This will hide the autocomplete box and background frame.
+        // Is there a case where we *shouldn't* hide this upfront?
+
+        // Uncomment show card stream first.
+        // transitionToWaiting();
+        transitionToRunning();
+
+        // Attach listener for tapping on a suggestion.
+        suggestionDropdown.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                String query = ((AutoCompleteModel) suggestionDropdown.getItemAtPosition(position))
+                        .getMainText();
+                startSearch(query);
+            }
+        });
+
+        return mainView;
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        inputMethodManager = null;
+        mainView = null;
+        searchBar = null;
+        if (null != suggestionDropdown) {
+            suggestionDropdown.setOnItemClickListener(null);
+            suggestionDropdown.setAdapter(null);
+            suggestionDropdown = null;
+        }
+        autoCompleteAdapter = null;
+    }
+
+    /**
+     * Handler for clicks of individual items.
+     */
+    @Override
+    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+        // TODO: Right now each row has its own click handler.
+        // Can we
+    }
+
+    /**
+     * Handler for the "search" button on the keyboard.
+     */
+    @Override
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+            startSearch(v.getText().toString());
+            return true;
+        }
+        return false;
+    }
+
+
+    private void initRows() {
+        // TODO: Query history for these items.
+        autoCompleteAdapter.add(new AutoCompleteModel("banana"));
+        autoCompleteAdapter.add(new AutoCompleteModel("cat pics"));
+        autoCompleteAdapter.add(new AutoCompleteModel("mexican food"));
+        autoCompleteAdapter.add(new AutoCompleteModel("cuba libre"));
+
+        autoCompleteAdapter.notifyDataSetChanged();
+    }
+
+
+    /**
+     * Send a search intent and put the widget into waiting.
+     */
+    private void startSearch(String queryString) {
+        if (getActivity() instanceof AcceptsSearchQuery) {
+            searchBar.setText(queryString);
+            searchBar.setSelection(queryString.length());
+            transitionToWaiting();
+            ((AcceptsSearchQuery) getActivity()).onSearch(queryString);
+        } else {
+            throw new RuntimeException("Parent activity does not implement AcceptsSearchQuery.");
+        }
+    }
+
+    private void transitionToWaiting() {
+        if (state == State.WAITING) {
+            return;
+        }
+        searchBar.setFocusable(false);
+        searchBar.setFocusableInTouchMode(false);
+        searchBar.clearFocus();
+        inputMethodManager.hideSoftInputFromWindow(searchBar.getWindowToken(), 0);
+        suggestionDropdown.setVisibility(View.GONE);
+        backdropFrame.setVisibility(View.GONE);
+        state = State.WAITING;
+    }
+
+    private void transitionToRunning() {
+        if (state == State.RUNNING) {
+            return;
+        }
+        searchBar.setFocusable(true);
+        searchBar.setFocusableInTouchMode(true);
+        searchBar.requestFocus();
+        inputMethodManager.showSoftInput(searchBar, InputMethodManager.SHOW_IMPLICIT);
+        suggestionDropdown.setVisibility(View.VISIBLE);
+        backdropFrame.setVisibility(View.VISIBLE);
+        state = State.RUNNING;
+    }
+
+    @Override
+    public void onJumpTap(String suggestion) {
+        searchBar.setText(suggestion);
+        // Move cursor to end of search input.
+        searchBar.setSelection(suggestion.length());
+        autoCompleteAgentManager.search(suggestion);
+    }
+
+
+    /**
+     * Receives messages from the SuggestionAgent's background thread.
+     */
+    private static class MainUiHandler extends Handler {
+
+        final AutoCompleteAdapter autoCompleteAdapter1;
+
+        public MainUiHandler(AutoCompleteAdapter autoCompleteAdapter) {
+            autoCompleteAdapter1 = autoCompleteAdapter;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            if (null == msg.obj) {
+                return;
+            }
+
+            if (!(msg.obj instanceof Iterable)) {
+                return;
+            }
+
+            autoCompleteAdapter1.clear();
+
+            for (Object obj : (Iterable) msg.obj) {
+                if (obj instanceof AutoCompleteModel) {
+                    autoCompleteAdapter1.add((AutoCompleteModel) obj);
+                }
+            }
+            autoCompleteAdapter1.notifyDataSetChanged();
+
+        }
+    }
+
+    /**
+     * Click handler for the backdrop. This should:
+     * - Remove focus from the search bar
+     * - Hide the keyboard
+     * - Hide the backdrop
+     * - Hide the suggestion box.
+     */
+    private class BackdropClickListener implements View.OnClickListener {
+        @Override
+        public void onClick(View v) {
+            transitionToWaiting();
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteModel.java
@@ -0,0 +1,31 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+/**
+ * The SuggestionModel is the data model behind the autocomplete rows. Right now it
+ * only has a text field. In the future, this could be extended to include other
+ * types of rows. For example, a row that has a URL and the name of a website.
+ */
+class AutoCompleteModel {
+
+    // The text that should immediately jump out to the user;
+    // for example, the name of a restaurant or the title
+    // of a website.
+    private final String mainText;
+
+    public AutoCompleteModel(String mainText) {
+        this.mainText = mainText;
+    }
+
+    public String getMainText() {
+        return mainText;
+    }
+
+    public String toString() {
+        return mainText;
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteRowView.java
@@ -0,0 +1,61 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+
+import android.content.Context;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.mozilla.search.R;
+
+/**
+ * One row withing the autocomplete suggestion list.
+ */
+class AutoCompleteRowView extends LinearLayout {
+
+    private TextView textView;
+    private AcceptsJumpTaps onJumpListener;
+
+    public AutoCompleteRowView(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setOrientation(LinearLayout.HORIZONTAL);
+        setGravity(Gravity.CENTER_VERTICAL);
+
+        LayoutInflater inflater =
+                (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        inflater.inflate(R.layout.search_auto_complete_row, this, true);
+
+        textView = (TextView) findViewById(R.id.auto_complete_row_text);
+
+        findViewById(R.id.auto_complete_row_jump_button).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (null == onJumpListener) {
+                    Log.e("SuggestionRow.onJump", "jump listener is null");
+                    return;
+                }
+
+                onJumpListener.onJumpTap(textView.getText().toString());
+            }
+        });
+    }
+
+    public void setMainText(String s) {
+        textView.setText(s);
+    }
+
+    public void setOnJumpListener(AcceptsJumpTaps onJumpListener) {
+        this.onJumpListener = onJumpListener;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/autocomplete/AutoCompleteWordListAgent.java
@@ -0,0 +1,153 @@
+/* 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/. */
+
+package org.mozilla.search.autocomplete;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.database.sqlite.SQLiteStatement;
+import android.util.Log;
+import android.widget.Toast;
+
+import org.mozilla.search.Constants;
+import org.mozilla.search.R;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Helper to search a word dictionary.
+ * From: https://developer.android.com/training/search/search.html
+ */
+class AutoCompleteWordListAgent {
+
+    public static final String COL_WORD = "WORD";
+    private static final String TAG = "DictionaryDatabase";
+    private static final String DATABASE_NAME = "DICTIONARY";
+    private static final String FTS_VIRTUAL_TABLE = "FTS";
+    private static final int DATABASE_VERSION = 1;
+
+    private final DatabaseOpenHelper databaseOpenHelper;
+
+    public AutoCompleteWordListAgent(Activity activity) {
+        databaseOpenHelper = new DatabaseOpenHelper(activity);
+        // DB helper uses lazy initialization, so this forces the db helper to start indexing the
+        // wordlist
+        databaseOpenHelper.getReadableDatabase();
+    }
+
+    public Cursor getWordMatches(String query) {
+        String selection = COL_WORD + " MATCH ?";
+        String[] selectionArgs = new String[]{query + "*"};
+        return query(selection, selectionArgs);
+    }
+
+    private Cursor query(String selection, String[] selectionArgs) {
+        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
+        builder.setTables(FTS_VIRTUAL_TABLE);
+
+        Cursor cursor = builder.query(databaseOpenHelper.getReadableDatabase(), null, selection,
+                selectionArgs, null, null, null, Constants.AUTOCOMPLETE_ROW_LIMIT);
+
+        if (cursor == null) {
+            return null;
+        } else if (!cursor.moveToFirst()) {
+            cursor.close();
+            return null;
+        }
+        return cursor;
+    }
+
+    private static class DatabaseOpenHelper extends SQLiteOpenHelper {
+
+        private final Activity activity;
+
+        private SQLiteDatabase database;
+
+        private static final String FTS_TABLE_CREATE =
+                "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + " USING fts3 (" + COL_WORD + ")";
+
+        DatabaseOpenHelper(Activity activity) {
+            super(activity, DATABASE_NAME, null, DATABASE_VERSION);
+            this.activity = activity;
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            database = db;
+            database.execSQL(FTS_TABLE_CREATE);
+
+            loadDictionary();
+        }
+
+        private void loadDictionary() {
+            new Thread(new Runnable() {
+                public void run() {
+                    try {
+
+                        activity.runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                Toast.makeText(activity, "Starting post-install indexing",
+                                        Toast.LENGTH_SHORT).show();
+                                Toast.makeText(activity,
+                                        "Don't worry; Mark & Ian we'll figure out a way around " +
+                                                "this :)", Toast.LENGTH_SHORT
+                                ).show();
+                            }
+                        });
+                        loadWords();
+                        activity.runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                Toast.makeText(activity, "All done!", Toast.LENGTH_SHORT).show();
+                            }
+                        });
+                    } catch (IOException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+            }).start();
+        }
+
+        private void loadWords() throws IOException {
+            final Resources resources = activity.getResources();
+            InputStream inputStream = resources.openRawResource(R.raw.en_us);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+
+
+            String sql = "INSERT INTO " + FTS_VIRTUAL_TABLE + " VALUES (?);";
+            SQLiteStatement statement = database.compileStatement(sql);
+            database.beginTransaction();
+
+            try {
+                String line;
+                while (null != (line = reader.readLine())) {
+                    statement.clearBindings();
+                    statement.bindString(1, line.trim());
+                    statement.execute();
+                }
+            } finally {
+                database.setTransactionSuccessful();
+                database.endTransaction();
+            }
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+            Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion +
+                    ", which will destroy all old data");
+            db.execSQL("DROP TABLE IF EXISTS " + FTS_VIRTUAL_TABLE);
+            onCreate(db);
+        }
+
+
+    }
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/stream/CardStreamFragment.java
@@ -0,0 +1,61 @@
+/* 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/. */
+
+package org.mozilla.search.stream;
+
+import android.os.Bundle;
+import android.support.v4.app.ListFragment;
+import android.view.View;
+import android.widget.ArrayAdapter;
+
+import org.mozilla.search.R;
+
+
+/**
+ * This fragment is responsible for managing the card stream. Right now
+ * we only use this during pre-search, but we could also use it
+ * during post-search at some point.
+ */
+public class CardStreamFragment extends ListFragment {
+
+    private ArrayAdapter<PreloadAgent.TmpItem> adapter;
+
+    /**
+     * Mandatory empty constructor for the fragment manager to instantiate the
+     * fragment (e.g. upon screen orientation changes).
+     */
+    public CardStreamFragment() {
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        getListView().setDivider(null);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        View headerView = getLayoutInflater(savedInstanceState)
+                .inflate(R.layout.search_stream_header, getListView(), false);
+        getListView().addHeaderView(headerView, null, false);
+        if (null == adapter) {
+            adapter = new ArrayAdapter<PreloadAgent.TmpItem>(getActivity(), R.layout.search_card,
+                    R.id.card_title, PreloadAgent.ITEMS) {
+                /**
+                 * Return false here disables the ListView from highlighting the click events
+                 * for each of the items. Each card should handle its own click events.
+                 */
+                @Override
+                public boolean isEnabled(int position) {
+                    return false;
+                }
+            };
+        }
+
+        setListAdapter(adapter);
+    }
+
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/java/org/mozilla/search/stream/PreloadAgent.java
@@ -0,0 +1,48 @@
+/* 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/. */
+
+package org.mozilla.search.stream;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A temporary agent for loading cards into the pre-load card stream.
+ * <p/>
+ * When we have more agents, we'll want to put an agent manager between the CardStreamFragment
+ * and the set of all agents. See autocomplete.AutoCompleteFragmentManager.
+ */
+class PreloadAgent {
+
+    public static final List<TmpItem> ITEMS = new ArrayList<TmpItem>();
+
+    private static final Map<String, TmpItem> ITEM_MAP = new HashMap<String, TmpItem>();
+
+    static {
+        addItem(new TmpItem("1", "Pre-load item1"));
+        addItem(new TmpItem("2", "Pre-load item2"));
+    }
+
+    private static void addItem(TmpItem item) {
+        ITEMS.add(item);
+        ITEM_MAP.put(item.id, item);
+    }
+
+    public static class TmpItem {
+        public final String id;
+        public final String content;
+
+        public TmpItem(String id, String content) {
+            this.id = id;
+            this.content = content;
+        }
+
+        @Override
+        public String toString() {
+            return content;
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/manifests/SearchAndroidManifest_activities.xml.in
@@ -0,0 +1,20 @@
+        <activity
+            android:name="org.mozilla.search.MainActivity"
+            android:label="@string/search_app_name"
+            android:theme="@style/AppTheme"
+            android:screenOrientation="portrait">
+
+            <!-- Add this to activity declaration to hide keyboard on launch -->
+            <!-- android:windowSoftInputMode="stateHidden" -->
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.ASSIST"/>
+
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/manifests/SearchAndroidManifest_permissions.xml.in
@@ -0,0 +1,2 @@
+    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
new file mode 100644
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c61cb923f1eac00d088f2d630a2afe981da7a24b
GIT binary patch
literal 4096
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..92b1172b5ce9c52af5334644e4bc5738ae1e5d1b
GIT binary patch
literal 3468
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
Y4U=<GjGkrQ?-6BbYG?A<$n(*E0Sw`xq5uE@
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1ddc286be0181a7b374b5707040a31f1e09e29bd
GIT binary patch
literal 4720
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
BA-Mnm
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/drawable/search_card_background.xml
@@ -0,0 +1,48 @@
+<!-- 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/. -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+    <item>
+        <shape>
+            <padding
+                android:bottom="5dp"
+                android:left="10dp"
+                android:right="10dp"
+                android:top="10dp"/>
+            <solid android:color="@color/transparent"/>
+        </shape>
+    </item>
+
+    <item>
+        <shape>
+            <padding
+                android:bottom="1dp"
+                android:left="0dp"
+                android:right="0dp"
+                android:top="0dp"/>
+            <solid android:color="@color/card_shadow_1"/>
+            <corners android:radius="2dp"/>
+        </shape>
+    </item>
+    <item>
+        <shape>
+            <padding
+                android:bottom="1dp"
+                android:left="0dp"
+                android:right="0dp"
+                android:top="0dp"/>
+            <solid android:color="@color/card_shadow_2"/>
+            <corners android:radius="2dp"/>
+        </shape>
+    </item>
+    <!-- Background -->
+    <item>
+        <shape>
+            <solid android:color="@color/card_background"/>
+            <corners android:radius="2dp"/>
+        </shape>
+    </item>
+</layer-list>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_activity_detail.xml
@@ -0,0 +1,20 @@
+<!-- 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/. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                xmlns:tools="http://schemas.android.com/tools"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:paddingBottom="@dimen/activity_vertical_margin"
+                android:paddingLeft="@dimen/activity_horizontal_margin"
+                android:paddingRight="@dimen/activity_horizontal_margin"
+                android:paddingTop="@dimen/activity_vertical_margin"
+                tools:context="org.mozilla.search.DetailActivity">
+
+    <org.mozilla.gecko.GeckoView
+        android:id="@+id/gecko_view"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"/>
+
+</RelativeLayout>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_activity_main.xml
@@ -0,0 +1,35 @@
+<!-- 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/. -->
+
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".MainActivity">
+
+
+    <FrameLayout
+        android:id="@+id/gecko_fragments"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="45dp"
+        />
+
+
+    <FrameLayout
+        android:id="@+id/presearch_fragments"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
+
+    <FrameLayout
+
+        android:id="@+id/header_fragments"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
+
+</merge>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_auto_complete.xml
@@ -0,0 +1,38 @@
+<!-- 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/. -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:tools="http://schemas.android.com/tools"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             tools:context=".autocomplete.AutoCompleteFragment"
+    >
+
+    <FrameLayout
+        android:id="@+id/auto_complete_backdrop"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:background="#a71f1f1f"
+        android:clickable="true"
+        android:focusable="true"/>
+
+    <LinearLayout
+
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/search_card_background"
+        android:orientation="vertical"
+        >
+
+        <EditText
+            android:id="@+id/auto_complete_search_bar"
+            style="@style/AutoCompleteEditText"/>
+
+        <ListView
+            android:id="@+id/auto_complete_dropdown"
+            style="@style/AutoCompleteDropdown"/>
+    </LinearLayout>
+
+
+</FrameLayout>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_auto_complete_row.xml
@@ -0,0 +1,27 @@
+<!-- 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/. -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:descendantFocusability="blocksDescendants"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/auto_complete_row_text"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="10dp"
+        android:layout_weight="1"/>
+
+    <Button
+        android:id="@+id/auto_complete_row_jump_button"
+        style="@style/BorderLessButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/search_jump_arrow"/>
+
+</LinearLayout>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_card.xml
@@ -0,0 +1,18 @@
+<!-- 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/. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="120dp"
+              android:background="@drawable/search_card_background"
+              android:orientation="vertical"
+    >
+
+    <TextView
+        android:id="@+id/card_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        />
+
+</LinearLayout>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/layout/search_stream_header.xml
@@ -0,0 +1,12 @@
+<!-- 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/. -->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+           android:layout_width="match_parent"
+           android:layout_height="100dp"
+           android:scaleType="centerCrop"
+           android:src="@drawable/search_header"
+           android:contentDescription="@string/search_header_image_content_description">
+
+</ImageView>
new file mode 100644
--- /dev/null
+++ b/mobile/android/search/res/raw/en_us.txt
@@ -0,0 +1,46988 @@
+46987
+0
+0th
+1
+1st
+1th
+2
+2nd
+2th
+3
+3rd
+3th
+4
+48245
+4th
+5
+5th
+6
+6th
+7
+7th
+8
+8th
+9
+9th
+a
+aa
+aaa
+aachen
+aah
+aaliyah
+aardvark
+aaron
+ab
+aba
+aback
+abacus
+abaft
+abalone
+abandon
+abandonment
+abase
+abasement
+abash
+abashed
+abashment
+abate
+abated
+abatement
+abattoir
+abbas
+abbasid
+abbe
+abbess
+abbey
+abbot
+abbott
+abbr
+abbrev
+abbreviate
+abbreviation
+abby
+abc
+abdicate
+abdication
+abdomen
+abdominal
+abduct
+abduction
+abductor
+abdul
+abe
+abeam
+abel
+abelard
+abelson
+aberdeen
+abernathy
+aberrant
+aberration
+aberrational
+abet
+abetted
+abetting
+abettor
+abeyance
+abhor
+abhorred
+abhorrence
+abhorrent
+abhorring
+abidance
+abide
+abiding
+abidjan
+abigail
+abilene
+ability
+abject
+abjection
+abjectness
+abjuration
+abjuratory
+abjure
+abjurer
+ablate
+ablation
+ablative
+ablaze
+able
+abler
+abloom
+ablution
+abm
+abnegate
+abnegation
+abner
+abnormal
+abnormality
+aboard
+abode
+abolish
+abolition
+abolitionism
+abolitionist
+abominable
+abominably
+abominate
+abomination
+aboriginal
+aborigine
+aborning
+abort
+abortion
+abortionist
+abortive
+abound
+about
+above
+aboveboard
+abracadabra
+abrade
+abraham
+abram
+abrasion
+abrasive
+abrasiveness
+abreast
+abridge
+abridgment
+abroad
+abrogate
+abrogation
+abrogator
+abrupt
+abruptness
+abs
+absalom
+abscess
+abscissa
+abscission
+abscond
+absconder
+abseil
+absence
+absent
+absentee
+absenteeism
+absentminded
+absentmindedness
+absinthe
+absolute
+absoluteness
+absolution
+absolutism
+absolutist
+absolve
+absorb
+absorbency
+absorbent
+absorbing
+absorption
+absorptive
+abstain
+abstainer
+abstemious
+abstemiousness
+abstention
+abstinence
+abstinent
+abstract
+abstracted
+abstractedness
+abstraction
+abstractness
+abstruse
+abstruseness
+absurd
+absurdity
+absurdness
+abuja
+abundance
+abundant
+abuse
+abuse's
+abuser
+abusive
+abusiveness
+abut
+abutment
+abutted
+abutting
+abuzz
+abysmal
+abyss
+abyssal
+abyssinia
+abyssinian
+ac
+acacia
+academe
+academia
+academic
+academical
+academician
+academy
+acadia
+acanthus
+acapulco
+accede
+accelerate
+acceleration
+accelerator
+accent
+accented
+accentual
+accentuate
+accentuation
+accenture
+accept
+acceptability
+acceptableness
+acceptably
+acceptance
+acceptation
+accepted
+access
+accessibility
+accessible
+accessibly
+accession
+accessorize
+accessory
+accident
+accidental
+acclaim
+acclamation
+acclimate
+acclimation
+acclimatization
+acclimatize
+acclivity
+accolade
+accommodate
+accommodating
+accommodation
+accompanied
+accompaniment
+accompanist
+accompany
+accomplice
+accomplish
+accomplished
+accomplishment
+accord
+accordance
+accordant
+according
+accordion
+accordionist
+accost
+account
+accountability
+accountable
+accountancy
+accountant
+accounted
+accounting
+accouter
+accouterments
+accra
+accredit
+accreditation
+accredited
+accretion
+accrual
+accrue
+acct
+acculturate
+acculturation
+accumulate
+accumulation
+accumulator
+accuracy
+accurate
+accurateness
+accursed
+accursedness
+accusation
+accusative
+accusatory
+accuse
+accuser
+accusing
+accustom
+accustomed
+ace
+acerbate
+acerbic
+acerbically
+acerbity
+acetaminophen
+acetate
+acetic
+acetone
+acetonic
+acetylene
+acevedo
+achaean
+ache
+achebe
+achene
+achernar
+acheson
+achieve
+achievement
+achiever
+achilles
+aching
+achoo
+achromatic
+achy
+acid
+acidic
+acidify
+acidity
+acidosis
+acidulous
+acknowledge
+acknowledged
+acknowledgment
+aclu
+acme
+acne
+acolyte
+aconcagua
+aconite
+acorn
+acosta
+acoustic
+acoustical
+acoustics
+acquaint
+acquaintance
+acquaintanceship
+acquainted
+acquiesce
+acquiescence
+acquiescent
+acquire
+acquirement
+acquisition
+acquisitive
+acquisitiveness
+acquit
+acquittal
+acquitted
+acquitting
+acre
+acreage
+acrid
+acridity
+acridness
+acrimonious
+acrimoniousness
+acrimony
+acrobat
+acrobatic
+acrobatically
+acrobatics
+acronym
+acrophobia
+acropolis
+across
+acrostic
+acrux
+acrylic
+act
+act's
+actaeon
+acth
+acting
+actinium
+action
+actionable
+activate
+activation
+activator
+active
+active's
+activeness
+actives
+activism
+activist
+activities
+activity
+acton
+actor
+actress
+acts
+actual
+actuality
+actualization
+actualize
+actuarial
+actuary
+actuate
+actuation
+actuator
+acuff
+acuity
+acumen
+acupressure
+acupuncture
+acupuncturist
+acute
+acuteness
+acyclovir
+ad
+ada
+adage
+adagio
+adam
+adamant
+adan
+adana
+adapt
+adaptability
+adaptation
+adapter
+adaption
+adar
+adc
+add
+addams
+addend
+addenda
+addendum
+adder
+adderley
+addict
+addiction
+addie
+addison
+addition
+additional
+additive
+addle
+address
+address's
+addressable
+addressee
+adduce
+adela
+adelaide
+adele
+adeline
+aden
+adenauer
+adenine
+adenoid
+adenoidal
+adept
+adeptness
+adequacy
+adequate
+adequateness
+adhara
+adhere
+adherence
+adherent
+adhesion
+adhesive
+adhesiveness
+adiabatic
+adidas
+adieu
+adios
+adipose
+adirondack
+adirondacks
+adj
+adjacency
+adjacent
+adjectival
+adjective
+adjoin
+adjourn
+adjournment
+adjudge
+adjudicate
+adjudication
+adjudicator
+adjudicatory
+adjunct
+adjuration
+adjure
+adjust
+adjustable
+adjuster
+adjustment
+adjutant
+adkins
+adler
+adm
+adman
+admen
+admin
+administer
+administrate
+administration
+administrative
+administrator
+admirably
+admiral
+admiralty
+admiration
+admire
+admirer
+admiring
+admissibility
+admissible
+admissibly
+admission
+admissions
+admit
+admittance
+admitted
+admitting
+admix
+admixture
+admonish
+admonishment
+admonition
+admonitory
+ado
+adobe
+adolescence
+adolescent
+adolf
+adolfo
+adolph
+adonis
+adopt
+adoptable
+adopter
+adoption
+adorableness
+adorably
+adoration
+adore
+adorer
+adoring
+adorn
+adorned
+adornment
+adp
+adrenal
+adrenalin
+adrenaline
+adrian
+adriana
+adriatic
+adrienne
+adrift
+adroit
+adroitness
+adsorb
+adsorbent
+adsorption
+adulate
+adulation
+adulator
+adulatory
+adult
+adulterant
+adulterate
+adulterated
+adulteration
+adulterer
+adulteress
+adulterous
+adultery
+adulthood
+adumbrate
+adumbration
+adv
+advance
+advancement
+advantage
+advantageous
+advent
+adventist
+adventitious
+adventure
+adventurer
+adventuresome
+adventuress
+adventurism
+adventurist
+adventurous
+adventurousness
+adverb
+adverbial
+adversarial
+adversary
+adverse
+adverseness
+adversity
+advert
+advertise
+advertised
+advertisement
+advertiser
+advertising
+advertorial
+advice
+advil
+advisability
+advisable
+advisably
+advise
+advised
+advisement
+adviser
+advisory
+advocacy
+advocate
+advt
+adze
+aegean
+aegis
+aelfric
+aeneas
+aeneid
+aeolus
+aerate
+aeration
+aerator
+aerial
+aerialist
+aerie
+aerobatic
+aerobatics
+aerobic
+aerobically
+aerobics
+aerodrome
+aerodynamic
+aerodynamically
+aerodynamics
+aeroflot
+aerogram
+aeronautic
+aeronautical
+aeronautics
+aerosol
+aerospace
+aeschylus
+aesculapius
+aesop
+aesthete
+aesthetic
+aesthetically
+aestheticism
+aesthetics
+af
+afaik
+afar
+afb
+afc
+afdc
+affability
+affable
+affably
+affair
+affect
+affect's
+affectation
+affected
+affecting
+affection
+affectionate
+affections
+afferent
+affiance
+affidavit
+affiliate
+affiliate's
+affiliated
+affiliation
+affiliations
+affinity
+affirm
+affirmation
+affirmative
+affix
+afflatus
+afflict
+affliction
+affluence
+affluent
+afford
+affordability
+afforest
+afforestation
+affray
+affront
+afghan
+afghanistan
+aficionado
+afield
+afire
+aflame
+afloat
+aflutter
+afn
+afoot
+aforementioned
+aforesaid
+aforethought
+afoul
+afr
+afraid
+afresh
+africa
+african
+afrikaans
+afrikaner
+afro
+afrocentric
+afrocentrism
+aft
+afterbirth
+afterbirths
+afterburner
+aftercare
+aftereffect
+afterglow
+afterimage
+afterlife
+afterlives
+aftermarket
+aftermath
+aftermaths
+afternoon
+aftershave
+aftershock
+aftertaste
+afterthought
+afterward
+afterword
+ag
+again
+against
+agamemnon
+agana
+agape
+agar
+agassi
+agassiz
+agate
+agatha
+agave
+age
+ageism
+ageist
+ageless
+agelessness
+agency
+agenda
+agent
+ageratum
+aggie
+agglomerate
+agglomeration
+agglutinate
+agglutination
+aggrandize
+aggrandizement
+aggravate
+aggravating
+aggravation
+aggregate
+aggregation
+aggression
+aggressive
+aggressiveness
+aggressor
+aggrieve
+aggro
+aghast
+agile
+agility
+aging
+agitate
+agitation
+agitator
+agitprop
+aglaia
+agleam
+aglitter
+aglow
+agnes
+agnew
+agni
+agnostic
+agnosticism
+ago
+agog
+agonize
+agonizing
+agony
+agoraphobia
+agoraphobic
+agra
+agrarian
+agrarianism
+agree
+agreeableness
+agreeably
+agreeing
+agreement
+agribusiness
+agricola
+agricultural
+agriculturalist
+agriculture
+agriculturist
+agrippa
+agrippina
+agronomic
+agronomist
+agronomy
+aground
+aguascalientes
+ague
+aguilar
+aguinaldo
+aguirre
+agustin
+ah
+aha
+ahab
+ahchoo
+ahead
+ahem
+ahmad
+ahmadabad
+ahmadinejad
+ahmed
+ahoy
+ahriman
+ai
+aid
+aida
+aide
+aided
+aids
+aidses
+aigrette
+aiken
+ail
+aileen
+aileron
+ailment
+aim
+aimee
+aimless
+aimlessness
+ain't
+ainu
+air
+airbag
+airbase
+airbed
+airborne
+airbrush
+airbus
+aircraft
+aircraftman
+aircraftmen
+aircrew
+airdrome
+airdrop
+airdropped
+airdropping
+airedale
+airfare
+airfield
+airflow
+airfoil
+airfreight
+airguns
+airhead
+airily
+airiness
+airing
+airless
+airlessness
+airletters
+airlift
+airline
+airliner
+airlock
+airmail
+airman
+airmen
+airplane
+airplay
+airport
+airship
+airshow
+airsick
+airsickness
+airspace
+airspeed
+airstrike
+airstrip
+airtight
+airtime
+airwaves
+airway
+airwoman
+airwomen
+airworthiness
+airworthy
+airy
+aisha
+aisle
+aitch
+ajar
+ajax
+ak
+aka
+akbar
+akhmatova
+akihito
+akimbo
+akin
+akita
+akiva
+akkad
+akron
+al
+ala
+alabama
+alabaman
+alabamian
+alabaster
+alack
+alacrity
+aladdin
+alamo
+alamogordo
+alan
+alana
+alar
+alaric
+alarm
+alarming
+alarmist
+alas
+alaska
+alaskan
+alb
+alba
+albacore
+albania
+albanian
+albany
+albatross
+albee
+albeit
+alberio
+albert
+alberta
+albertan
+alberto
+albigensian
+albinism
+albino
+albion
+albireo
+album
+albumen
+albumin
+albuminous
+albuquerque
+alcatraz
+alcestis
+alchemist
+alchemy
+alcibiades
+alcindor
+alcmena
+alcoa
+alcohol
+alcoholic
+alcoholically
+alcoholism
+alcott
+alcove
+alcuin
+alcyone
+aldan
+aldebaran
+alden
+alder
+alderamin
+alderman
+aldermen
+alderwoman
+alderwomen
+aldo
+aldrin
+ale
+aleatory
+alec
+alehouse
+aleichem
+alejandra
+alejandro
+alembert
+alembic
+aleppo
+alert
+alertness
+aleut
+aleutian
+alewife
+alewives
+alex
+alexander
+alexandra
+alexandria
+alexandrian
+alexei
+alexis
+alfalfa
+alfonso
+alfonzo
+alford
+alfred
+alfreda
+alfredo
+alfresco
+alga
+algae
+algal
+algebra
+algebraic
+algebraically
+algenib
+alger
+algeria
+algerian
+algieba
+algiers
+algol
+algonquian
+algonquin
+algorithm
+algorithmic
+alhambra
+alhena
+ali
+alias
+alibi
+alice
+alicia
+alien
+alienable
+alienate
+alienation
+alienist
+alighieri
+alight
+align
+aligned
+aligner
+alignment
+alike
+aliment
+alimentary
+alimony
+aline
+alioth
+alisa
+alisha
+alison
+alissa
+alistair
+aliveness
+aliyah
+aliyahs
+alkaid
+alkali
+alkalies
+alkaline
+alkalinity
+alkalize
+alkaloid
+alkyd
+all
+allah
+allahabad
+allan
+allay
+allegation
+allege
+alleged
+alleghenies
+allegheny
+allegiance
+allegoric
+allegorical
+allegorist
+allegory
+allegra
+allegretto
+allegro
+allele
+alleluia
+allen
+allende
+allentown
+allergen
+allergenic
+allergic
+allergically
+allergist
+allergy
+alleviate
+alleviation
+alley
+alleyway
+allhallows
+alliance
+allie
+alligator
+allison
+alliterate
+alliteration
+alliterative
+allocate
+allocation
+allocations
+allot
+allotment
+allotted
+allotting
+allover
+allow
+allowable
+allowably
+allowance
+alloy
+alloyed
+allspice
+allstate
+allude
+allure
+allurement
+alluring
+allusion
+allusive
+allusiveness
+alluvial
+alluvium
+ally
+allyson
+alma
+almach
+almanac
+almaty
+almighty
+almohad
+almond
+almoner
+almoravid
+almost
+alms
+almshouse
+alnilam
+alnitak
+aloe
+aloft
+aloha
+alone
+along
+alongshore
+alongside
+alonzo
+aloof
+aloofness
+aloud
+alp
+alpaca
+alpert
+alpha
+alphabet
+alphabetic
+alphabetical
+alphabetization
+alphabetize
+alphabetizer
+alphanumeric
+alphanumerical
+alphard
+alphecca
+alpheratz
+alphonse
+alphonso
+alpine
+alpo
+alps
+already
+alright
+alsace
+alsatian
+also
+alsop
+alston
+alt
+alta
+altai
+altaic
+altair
+altamira
+altar
+altarpiece
+alter
+alterable
+alteration
+altercation
+altered
+alternate
+alternation
+alternative
+alternator
+althea
+although
+altimeter
+altiplano
+altitude
+altman
+alto
+altogether
+altoids
+alton
+altruism
+altruist
+altruistic
+altruistically
+aludra
+alum
+alumina
+aluminum
+alumna
+alumnae
+alumni
+alumnus
+alva
+alvarado
+alvarez
+alvaro
+alveolar
+alvin
+always
+alyce
+alyson
+alyssa
+alzheimer
+am
+ama
+amadeus
+amado
+amalgam
+amalgamate
+amalgamation
+amalia
+amanda
+amanuenses
+amanuensis
+amaranth
+amaranths
+amaretto
+amarillo
+amaru
+amaryllis
+amass
+amaterasu
+amateur
+amateurish
+amateurishness
+amateurism
+amati
+amatory
+amaze
+amazement
+amazing
+amazon
+amazonian
+ambassador
+ambassadorial
+ambassadorship
+ambassadress
+amber
+ambergris
+ambiance
+ambidexterity
+ambidextrous
+ambient
+ambiguity
+ambiguous
+ambit
+ambition
+ambitious
+ambitiousness
+ambivalence
+ambivalent
+amble
+ambler
+ambrosia
+ambrosial
+ambulance
+ambulanceman
+ambulancemen
+ambulancewoman
+ambulancewomen
+ambulant
+ambulate
+ambulation
+ambulatory
+ambuscade
+ambush
+amelia
+ameliorate
+amelioration
+amen
+amenability
+amenably
+amend
+amendment
+amenhotep
+amenity
+amerasian
+amerce
+amercement
+america
+american
+americana
+americanism
+americanization
+americanize
+americium
+amerind
+amerindian
+ameslan
+amethyst
+amharic
+amherst
+amiability
+amiable
+amiably
+amicability
+amicable
+amicably
+amid
+amide
+amidships
+amie
+amiga
+amigo
+amish
+amiss
+amity
+amman
+ammeter
+ammo
+ammonia
+ammunition
+amnesia
+amnesiac
+amnesic
+amnesty
+amniocenteses
+amniocentesis
+amnion
+amniotic
+amoco
+amoeba
+amoebae
+amoebic
+amok
+among
+amontillado
+amoral
+amorality
+amorous
+amorousness
+amorphous
+amorphousness
+amortization
+amortize
+amos
+amount
+amour
+amp
+amparo
+amperage
+ampere
+ampersand
+amphetamine
+amphibian
+amphibious
+amphitheater
+amphora
+amphorae
+ample
+amplification
+amplifier
+amplify
+amplitude
+ampule
+amputate
+amputation
+amputee
+amritsar
+amsterdam
+amt
+amtrak
+amulet
+amundsen
+amur
+amuse
+amusement
+amusing
+amway
+amy
+amylase
+an
+ana
+anabaptist
+anabel
+anabolism
+anachronism
+anachronistic
+anachronistically
+anacin
+anaconda
+anacreon
+anaerobe
+anaerobic
+anaerobically
+anagram
+anaheim
+anal
+analects
+analgesia
+analgesic
+analog
+analogical
+analogize
+analogous
+analogousness
+analogue
+analogy
+analysand
+analyses
+analysis
+analyst
+analytic
+analytically
+analyzable
+analyze
+analyzer
+ananias
+anapest
+anapestic
+anarchic
+anarchically
+anarchism
+anarchist
+anarchistic
+anarchy
+anasazi
+anastasia
+anathema
+anathematize
+anatole
+anatolia
+anatolian
+anatomic
+anatomical
+anatomist
+anatomize
+anatomy
+anaxagoras
+ancestor
+ancestral
+ancestress
+ancestry
+anchor
+anchorage
+anchorite
+anchorman
+anchormen
+anchorpeople
+anchorperson
+anchorwoman
+anchorwomen
+anchovy
+ancient
+ancientness
+ancillary
+and
+andalusia
+andalusian
+andaman
+andante
+andean
+andersen
+anderson
+andes
+andiron
+andorra
+andorran
+andre
+andrea
+andrei
+andretti
+andrew
+andrianampoinimerina
+androgen
+androgenic
+androgynous
+androgyny
+android
+andromache
+andromeda
+andropov
+andy
+anecdotal
+anecdote
+anemia
+anemic
+anemically
+anemometer
+anemone
+anent
+anesthesia
+anesthesiologist
+anesthesiology
+anesthetic
+anesthetist
+anesthetization
+anesthetize
+aneurysm
+anew
+angara
+angel
+angela
+angelfish
+angelia
+angelic
+angelica
+angelical
+angelico
+angelina
+angeline
+angelique
+angelita
+angelo
+angelou
+anger
+angevin
+angie
+angina
+angioplasty
+angiosperm
+angkor
+angle
+angler
+angleworm
+anglia
+anglican
+anglicanism
+anglicism
+anglicization
+anglicize
+angling
+anglo
+anglophile
+anglophobe
+anglophone
+angola
+angolan
+angora
+angostura
+angrily
+angry
+angst
+angstrom
+anguilla
+anguish
+angular
+angularity
+angus
+anhydrous
+aniakchak
+anibal
+aniline
+animadversion
+animadvert
+animal
+animalcule
+animate
+animated
+animation
+animations
+animator
+animism
+animist
+animistic
+animosity
+animus
+anion
+anionic
+anise
+aniseed
+anisette
+anita
+ankara
+ankh
+ankhs
+ankle
+anklebone
+anklet
+ann
+anna
+annabel
+annabelle
+annalist
+annals
+annam
+annapolis
+annapurna
+anne
+anneal
+annelid
+annette
+annex
+annexation
+annie
+annihilate
+annihilation
+annihilator
+anniversary
+annmarie
+annotate
+annotation
+annotator
+announce
+announced
+announcement
+announcer
+annoy
+annoyance
+annoying
+annoyware
+annual
+annualized
+annuitant
+annuity
+annul
+annular
+annulled
+annulling
+annulment
+annunciation
+anode
+anodize
+anodyne
+anoint
+anointment
+anomalous
+anomaly
+anon
+anonymity
+anonymous
+anopheles
+anorak
+anorectic
+anorexia
+anorexic
+another
+anouilh
+anselm
+anselmo
+anshan
+ansi
+answer
+answerable
+answered
+answerphone
+ant
+antacid
+antaeus
+antagonism
+antagonist
+antagonistic
+antagonistically
+antagonize
+antananarivo
+antarctic
+antarctica
+antares
+ante
+anteater
+antebellum
+antecedence
+antecedent
+antechamber
+antedate
+antediluvian
+anteing
+antelope
+antenatal
+antenna
+antennae
+anterior
+anteroom
+anthem
+anther
+anthill
+anthologist
+anthologize
+anthology
+anthony
+anthracite
+anthrax
+anthropocentric
+anthropoid
+anthropological
+anthropologist
+anthropology
+anthropomorphic
+anthropomorphically
+anthropomorphism
+anthropomorphous
+anti
+antiabortion
+antiabortionist
+antiaircraft
+antibacterial
+antibiotic
+antibody
+antic
+anticancer
+antichrist
+anticipate
+anticipated
+anticipation
+anticipatory
+anticked
+anticking
+anticlerical
+anticlimactic
+anticlimactically
+anticlimax
+anticline
+anticlockwise
+anticoagulant
+anticommunism
+anticommunist
+anticyclone
+anticyclonic
+antidemocratic
+antidepressant
+antidote
+antietam
+antifascist
+antifreeze
+antigen
+antigenic
+antigenicity
+antigone
+antigua
+antihero
+antiheroes
+antihistamine
+antiknock
+antilabor
+antillean
+antilles
+antilogarithm
+antimacassar
+antimalarial
+antimatter
+antimicrobial
+antimissile
+antimony
+antinuclear
+antioch
+antioxidant
+antiparticle
+antipas
+antipasti
+antipasto
+antipathetic
+antipathy
+antipersonnel
+antiperspirant
+antiphon
+antiphonal
+antipodal
+antipodean
+antipodes
+antipollution
+antipoverty
+antiquarian
+antiquarianism
+antiquary
+antiquate
+antique
+antiquity
+antirrhinum
+antisemitic
+antisemitism
+antisepsis
+antiseptic
+antiseptically
+antiserum
+antislavery
+antisocial
+antispasmodic
+antisubmarine
+antitank
+antitheses
+antithesis
+antithetic
+antithetical
+antitoxin
+antitrust
+antivenin
+antiviral
+antivivisectionist
+antiwar
+antler
+antofagasta
+antoine
+antoinette
+anton
+antone
+antonia
+antoninus
+antonio
+antonius
+antony
+antonym
+antonymous
+antsy
+antwan
+antwerp
+anubis
+anus
+anvil
+anxiety
+anxious
+anxiousness
+any
+anybody
+anyhow
+anymore
+anyone
+anyplace
+anything
+anytime
+anyway
+anywhere
+anywise
+anzac
+anzus
+aol
+aorta
+aortic
+ap
+apace
+apache
+apalachicola
+apart
+apartheid
+apartment
+apathetic
+apathetically
+apathy
+apatite
+apb
+ape
+apelike
+apennines
+aperitif
+aperture
+apex
+aphasia
+aphasic
+aphelia
+aphelion
+aphid
+aphorism
+aphoristic
+aphoristically
+aphrodisiac
+aphrodite
+apia
+apiarist
+apiary
+apical
+apiece
+apish
+aplenty
+aplomb
+apo
+apocalypse
+apocalyptic
+apocrypha
+apocryphal
+apogee
+apolitical
+apollinaire
+apollo
+apollonian
+apologetic
+apologetically
+apologia
+apologist
+apologize
+apology
+apoplectic
+apoplexy
+apostasy
+apostate
+apostatize
+apostle
+apostleship
+apostolic
+apostrophe
+apothecary
+apothegm
+apotheoses
+apotheosis
+app
+appalachia
+appalachian
+appall
+appalling
+appaloosa
+apparatchik
+apparatus
+apparel
+apparent
+apparition
+appeal
+appealing
+appear
+appearance
+appease
+appeasement
+appeaser
+appellant
+appellate
+appellation
+append
+appendage
+appendectomy
+appendices
+appendicitis
+appendix
+appertain
+appetite
+appetizer
+appetizing
+applaud
+applauder
+applause
+apple
+applejack
+applesauce
+appleseed
+applet
+appleton
+appliance
+applicability
+applicable
+applicably
+applicant
+application
+applicator
+applier
+applique
+appliqueing
+apply
+appoint
+appointee
+appointment
+appointment's
+appomattox
+apportion
+apportionment
+appose
+apposite
+appositeness
+apposition
+appositive
+appraisal
+appraise
+appraiser
+appreciable
+appreciably
+appreciate
+appreciated
+appreciation
+appreciative
+appreciator
+appreciatory
+apprehend
+apprehension
+apprehensive
+apprehensiveness
+apprentice
+apprenticeship
+apprise
+approach
+approachable
+approbation
+approbations
+appropriate
+appropriated
+appropriateness
+appropriation
+appropriator
+approval
+approvals
+approve
+approved
+approving
+approx
+approximate
+approximation
+appurtenance
+appurtenant
+apr
+apricot
+april
+apron
+apropos
+apse
+apt
+apter
+aptitude
+aptness
+apuleius
+aqua
+aquaculture
+aquafresh
+aqualung
+aquamarine
+aquanaut
+aquaplane
+aquarium
+aquarius
+aquatic
+aquatically
+aquatics
+aquatint
+aquavit
+aqueduct
+aqueous
+aquifer
+aquila
+aquiline
+aquinas
+aquino
+aquitaine
+ar
+ara
+arab
+arabesque
+arabia
+arabian
+arabic
+arability
+arabist
+araby
+araceli
+arachnid
+arachnophobia
+arafat
+araguaya
+aral
+aramaic
+aramco
+arapaho
+arapahoes
+ararat
+araucanian
+arawak
+arawakan
+arbiter
+arbitrage
+arbitrager
+arbitrageur
+arbitrament
+arbitrarily
+arbitrariness
+arbitrary
+arbitrate
+arbitration
+arbitrator
+arbitron
+arbor
+arboreal
+arboretum
+arborvitae
+arbutus
+arc
+arcade
+arcadia
+arcadian
+arcane
+arch
+archaeological
+archaeologist
+archaeology
+archaic
+archaically
+archaism
+archaist
+archangel
+archbishop
+archbishopric
+archdeacon
+archdiocesan
+archdiocese
+archduchess
+archduke
+archean
+archenemy
+archer
+archery
+archetypal
+archetype
+archfiend
+archibald
+archie
+archiepiscopal
+archimedes
+archipelago
+architect
+architectonic
+architectonics
+architectural
+architecture
+architrave
+archival
+archive
+archivist
+archness
+archway
+arctic
+arcturus
+ardabil
+arden
+ardent
+ardor
+arduous
+arduousness
+are
+area
+areal
+aren't
+arena
+arequipa
+ares
+argent
+argentina
+argentine
+argentinean
+argentinian
+argo
+argon
+argonaut
+argonne
+argosy
+argot
+arguable
+arguably
+argue
+arguer
+argument
+argumentation
+argumentative
+argumentativeness
+argus
+argyle
+aria
+ariadne
+arianism
+arid
+aridity
+ariel
+aries
+aright
+ariosto
+arise
+arisen
+aristarchus
+aristides
+aristocracy
+aristocrat
+aristocratic
+aristocratically
+aristophanes
+aristotelian
+aristotle
+arithmetic
+arithmetical
+arithmetician
+arius
+ariz
+arizona
+arizonan
+arizonian
+arjuna
+ark
+arkansan
+arkansas
+arkhangelsk
+arkwright
+arlene
+arline
+arlington
+arm
+arm's
+armada
+armadillo
+armageddon
+armagnac
+armament
+armaments
+armand
+armando
+armani
+armature
+armband
+armchair
+armed
+armenia
+armenian
+armful
+armhole
+arminius
+armistice
+armlet
+armload
+armonk
+armor
+armored
+armorer
+armorial
+armory
+armour
+armpit
+armrest
+armstrong
+army
+arneb
+arnhem
+arno
+arnold
+arnulfo
+aroma
+aromatherapist
+aromatherapy
+aromatic
+aromatically
+aron
+arose
+around
+arousal
+arouse
+arpeggio
+arr
+arraign
+arraignment
+arrange
+arrangement
+arrangement's
+arranger
+arrant
+arras
+array
+arrears
+arrest
+arrhenius
+arrhythmia
+arrhythmic
+arrhythmical
+arrival
+arrive
+arrogance
+arrogant
+arrogate
+arrogation
+arron
+arrow
+arrowhead
+arrowroot
+arroyo
+arsed
+arsenal
+arsenic
+arsing
+arson
+arsonist
+art
+artaxerxes
+artemis
+arterial
+arteriole
+arteriosclerosis
+artery
+artful
+artfulness
+arthritic
+arthritis
+arthropod
+arthroscope
+arthroscopic
+arthur
+arthurian
+artichoke
+article
+articulacy
+articular
+articulate
+articulateness
+articulation
+artie
+artifact
+artifice
+artificer
+artificial
+artificiality
+artillery
+artilleryman
+artillerymen
+artiness
+artisan
+artist
+artiste
+artistic
+artistically
+artistry
+artless
+artlessness
+artsy
+arturo
+artwork
+arty
+aruba
+arugula
+arum
+aryan
+asama
+asap
+asbestos
+ascella
+ascend
+ascendance
+ascendancy
+ascendant
+ascension
+ascent
+ascertain
+ascertainment
+ascetic
+ascetically
+asceticism
+ascii
+ascot
+ascribe
+ascription
+aseptic
+aseptically
+asexual
+asexuality
+asgard
+ash
+ashamed
+ashanti
+ashcan
+ashcroft
+ashe
+ashgabat
+ashikaga
+ashkenazim
+ashkhabad
+ashlar
+ashlee
+ashley
+ashmolean
+ashore
+ashram
+ashtray
+ashurbanipal
+ashy
+asia
+asian
+asiatic
+aside
+asimov
+asinine
+asininity
+ask
+askance
+asked
+askew
+asl
+aslant
+asleep
+asmara
+asocial
+asoka
+asp
+asparagus
+aspartame
+aspca
+aspect
+aspell
+aspen
+asperity
+aspersion
+asphalt
+asphodel
+asphyxia
+asphyxiate
+asphyxiation
+aspic
+aspidiske
+aspidistra
+aspirant
+aspirate
+aspiration
+aspirator
+aspire
+aspirin
+asquith
+ass
+assad
+assail
+assailable
+assailant
+assam
+assamese
+assassin
+assassinate
+assassination
+assault
+assay
+assayer
+assemblage
+assemble
+assembler
+assemblies
+assembly
+assemblyman
+assemblymen
+assemblywoman
+assemblywomen
+assent
+assert
+assertion
+assertions
+assertive
+assertiveness
+assess
+assessment
+assessor
+asset
+asseverate
+asseveration
+asshole
+assiduity
+assiduous
+assiduousness
+assign
+assign's
+assignable
+assignation
+assigned
+assigner
+assignment
+assignor
+assimilate
+assimilation
+assisi
+assist
+assistance
+assistant
+assisted
+assize
+assn
+assoc
+associate
+associate's
+association
+associations
+assonance
+assonant
+assort
+assortment
+asst
+assuage
+assume
+assumption
+assumptive
+assurance
+assure
+assured
+assyria
+assyrian
+astaire
+astana
+astarte
+astatine
+aster
+asterisk
+astern
+asteroid
+asthma
+asthmatic
+asthmatically
+astigmatic
+astigmatism
+astir
+aston
+astonish
+astonishing
+astonishment
+astor
+astoria
+astound
+astounding
+astraddle
+astrakhan
+astral
+astray
+astride
+astringency
+astringent
+astrolabe
+astrologer
+astrological
+astrologist
+astrology
+astronaut
+astronautic
+astronautical
+astronautics
+astronomer
+astronomic
+astronomical
+astronomy
+astrophysical
+astrophysicist
+astrophysics
+astroturf
+asturias
+astute
+astuteness
+asuncion
+asunder
+aswan
+asylum
+asymmetric
+asymmetrical
+asymmetry
+asymptomatic
+asymptotic
+asymptotically
+asynchronous
+at
+atacama
+atahualpa
+atalanta
+atari
+ataturk
+atavism
+atavist
+atavistic
+ataxia
+ataxic
+ate
+atelier
+athabasca
+athabaskan
+atheism
+atheist
+atheistic
+athena
+athene
+athenian
+athens
+atherosclerosis
+athirst
+athlete
+athletic
+athletically
+athleticism
+athletics
+athwart
+atilt
+atishoo
+atkins
+atkinson
+atlanta
+atlantes
+atlantic
+atlantis
+atlas
+atm
+atman
+atmosphere
+atmospheric
+atmospherically
+atmospherics
+atoll
+atom
+atomic
+atomically
+atomize
+atomizer
+atonal
+atonality
+atone
+atonement
+atop
+atp
+atreus
+atria
+atrial
+atrium
+atrocious
+atrociousness
+atrocity
+atrophy
+atropine
+atropos
+attach
+attache
+attached
+attachment
+attachments
+attack
+attacker
+attain
+attainability
+attainable
+attainder
+attainment
+attar
+attempt
+attempt's
+attend
+attendance
+attendant
+attended
+attendee
+attention
+attentions
+attentive
+attentiveness
+attenuate
+attenuation
+attest
+attestation
+attested
+attic
+attica
+attila
+attire
+attitude
+attitudinal
+attitudinize
+attlee
+attn
+attorney
+attract
+attractant
+attraction
+attractive
+attractiveness
+attribute
+attributed
+attribution
+attributive
+attrition
+attucks
+attune
+atty
+atv
+atwitter
+atwood
+atypical
+au
+aubergine
+aubrey
+auburn
+auckland
+auction
+auctioneer
+audacious
+audaciousness
+audacity
+auden
+audi
+audibility
+audible
+audibly
+audience
+audio
+audiological
+audiologist
+audiology
+audiometer
+audion
+audiophile
+audiotape
+audiovisual
+audiovisuals
+audit
+audition
+auditor
+auditorium
+auditory
+audra
+audrey
+audubon
+aug
+augean
+auger
+aught
+augment
+augmentation
+augmentative
+augmenter
+augsburg
+augur
+augury
+august
+augusta
+augustan
+augustine
+augustinian
+augustness
+augustus
+auk
+aunt
+auntie
+aura
+aural
+aurangzeb
+aurelia
+aurelio
+aurelius
+aureole
+aureomycin
+auricle
+auricular
+auriga
+aurora
+auschwitz
+auscultate
+auscultation
+auspice
+auspicious
+auspiciousness
+aussie
+austen
+austere
+austerity
+austerlitz
+austin
+austral
+australasia
+australasian
+australia
+australian
+australoid
+australopithecus
+austria
+austrian
+austronesian
+authentic
+authentically
+authenticate
+authenticated
+authentication
+authenticity
+author
+authoress
+authorial
+authoritarian
+authoritarianism
+authoritative
+authoritativeness
+authority
+authorization
+authorize
+authorized
+authorship
+autism
+autistic
+auto
+autobahn
+autobiographer
+autobiographic
+autobiographical
+autobiography
+autoclave
+autocracy
+autocrat
+autocratic
+autocratically
+autocross
+autodidact
+autograph
+autographs
+autoimmune
+autoimmunity
+automaker
+automate
+automatic
+automatically
+automation
+automatism
+automatize
+automaton
+automobile
+automotive
+autonomic
+autonomous
+autonomy
+autopilot
+autopsy
+autosuggestion
+autoworker
+autumn
+autumnal
+aux
+auxiliary
+auxin
+av
+ava
+avail
+availability
+available
+avalanche
+avalon
+avarice
+avaricious
+avast
+avatar
+avaunt
+avdp
+ave
+avenge
+avenger
+aventine
+avenue
+average
+avernus
+averred
+averring
+averroes
+averse
+aversion
+avert
+avery
+avesta
+avg
+avian
+aviary
+aviation
+aviator
+aviatrices
+aviatrix
+avicenna
+avid
+avidity
+avignon
+avila
+avionic
+avionics
+avior
+avis
+avitaminosis
+avocado
+avocation
+avocational
+avogadro
+avoid
+avoidable
+avoidably
+avoidance
+avoirdupois
+avon
+avouch
+avow
+avowal
+avowed
+avuncular
+aw
+awacs
+await
+awake
+awaken
+awakening
+award
+aware
+awareness
+awash
+away
+awe
+aweigh
+awesome
+awesomeness
+awestruck
+awful
+awfuller
+awfullest
+awfulness
+awhile
+awkward
+awkwardness
+awl
+awn
+awning
+awoke
+awoken
+awol
+awry
+ax
+axial
+axiom
+axiomatic
+axiomatically
+axis
+axle
+axletree
+axolotl
+axon
+axum
+ayah
+ayahs
+ayala
+ayatollah
+ayatollahs
+aye
+ayers
+aymara
+ayrshire
+ayurveda
+ayyubid
+az
+azalea
+azana
+azania
+azazel
+azerbaijan
+azerbaijani
+azimuth
+azimuths
+azores
+azov
+azt
+aztec
+aztecan
+aztlan
+azure
+b
+ba
+baa
+baal
+baath
+baathist
+babbage
+babbitt
+babble
+babbler
+babe
+babel
+baboon
+babushka
+baby
+babyhood
+babyish
+babylon
+babylonia
+babylonian
+babysat
+babysit
+babysitter
+babysitting
+bacall
+bacardi
+baccalaureate
+baccarat
+bacchanal
+bacchanalia
+bacchanalian
+bacchic
+bacchus
+baccy
+bach
+bachelor
+bachelorhood
+bacillary
+bacilli
+bacillus
+back
+backache
+backbench
+backbit
+backbite
+backbiter
+backbitten
+backboard
+backbone
+backbreaking
+backchat
+backcloth
+backcloths
+backcomb
+backdate
+backdoor
+backdrop
+backer
+backfield
+backfire
+backgammon
+background
+backgrounder
+backhand
+backhanded
+backhander
+backhoe
+backing
+backlash
+backless
+backlog
+backlogged
+backlogging
+backpack
+backpacker
+backpacking
+backpedal
+backrest
+backroom
+backscratching
+backseat
+backside
+backslapper
+backslapping
+backslash
+backslid
+backslide
+backslider
+backspace
+backspin
+backstabber
+backstabbing
+backstage
+backstair
+backstop
+backstopped
+backstopping
+backstreet
+backstretch
+backstroke
+backtalk
+backtrack
+backup
+backus
+backward
+backwardness
+backwash
+backwater
+backwoods
+backwoodsman
+backwoodsmen
+backyard
+bacon
+bacteria
+bacterial
+bactericidal
+bactericide
+bacteriologic
+bacteriological
+bacteriologist
+bacteriology
+bacterium
+bactria
+bad
+badder
+baddest
+baddie
+bade
+baden
+badge
+badger
+badinage
+badlands
+badman
+badmen
+badminton
+badmouth
+badmouths
+badness
+baedeker
+baez
+baffin
+baffle
+bafflement
+baffler
+bag
+bagatelle
+bagel
+bagful
+baggage
+bagged
+baggie
+baggies
+baggily
+bagginess
+bagging
+baggy
+baghdad
+bagpipe
+bagpiper
+baguette
+baguio
+bah
+baha'i
+baha'ullah
+bahama
+bahamanian
+bahamas
+bahamian
+bahia
+bahrain
+baht
+baikal
+bail
+bailey
+bailiff
+bailiwick
+bailout
+bailsman
+bailsmen
+baird
+bairn
+bait
+baize
+bake
+baked
+bakelite
+baker
+bakersfield
+bakery
+bakeshop
+baklava
+baksheesh
+baku
+bakunin
+balaclava
+balalaika
+balance
+balance's
+balanchine
+balaton
+balboa
+balcony
+bald
+balder
+balderdash
+baldfaced
+baldness
+baldric
+baldwin
+baldy
+bale
+balearic
+baleen
+baleful
+balefulness
+baler
+balfour
+bali
+balinese
+balk
+balkan
+balkhash
+balky
+ball
+ballad
+balladeer
+balladry
+ballard
+ballast
+ballcock
+ballerina
+ballet
+balletic
+ballgame
+ballgirl
+ballgown
+ballistic
+ballistics
+balloon
+balloonist
+ballot
+ballpark
+ballplayer
+ballpoint
+ballroom
+balls
+ballsy
+bally
+ballyhoo
+balm
+balminess
+balmy
+baloney
+balsa
+balsam
+balsamic
+balthazar
+baltic
+baltimore
+baluchistan
+baluster
+balustrade
+balzac
+bamako
+bambi
+bamboo
+bamboozle
+ban
+banach
+banal
+banality
+banana
+bancroft
+band
+band's
+bandage
+bandanna
+bandbox
+bandeau
+bandeaux
+bandit
+banditry
+bandleader
+bandmaster
+bandoleer
+bandsman
+bandsmen
+bandstand
+bandung
+bandwagon
+bandwidth
+bandwidths
+bandy
+bane
+baneful
+bang
+bangalore
+bangkok
+bangladesh
+bangladeshi
+bangle
+bangor
+bangui
+bani
+banish
+banishment
+banister
+banjarmasin
+banjo
+banjoist
+banjul
+bank
+bankbook
+bankcard
+banker
+banking
+banknote
+bankroll
+bankrupt
+bankruptcy
+banks
+banned
+banneker
+banner
+banning
+bannister
+bannock
+banns
+banquet
+banqueter
+banquette
+banshee
+bantam
+bantamweight
+banter
+bantering
+banting
+bantu
+banyan
+banzai
+baobab
+baotou
+bap
+baptism
+baptismal
+baptist
+baptiste
+baptistery
+baptize
+baptized
+baptizer
+bar
+bar's
+barabbas
+barack
+barb
+barbadian
+barbados
+barbara
+barbarella
+barbarian
+barbarianism
+barbaric
+barbarically
+barbarism
+barbarity
+barbarize
+barbarossa
+barbarous
+barbary
+barbecue
+barbel
+barbell
+barber
+barberry
+barbershop
+barbie
+barbiturate
+barbour
+barbra
+barbuda
+barbwire
+barcarole
+barcelona
+barclay
+bard
+bardeen
+bardic
+bare
+bareback
+barefaced
+barefoot
+barehanded
+bareheaded
+barelegged
+bareness
+barents
+barf
+barfly
+bargain
+bargainer
+barge
+bargeman
+bargemen
+barhop
+barhopped
+barhopping
+baritone
+barium
+bark
+bark's
+barkeep
+barkeeper
+barker
+barkley
+barley
+barlow
+barmaid
+barman
+barmen
+barmy
+barn
+barnabas
+barnaby
+barnacle
+barnard
+barnaul
+barnes
+barnett
+barney
+barnstorm
+barnstormer
+barnum
+barnyard
+baroda
+barometer
+barometric
+barometrically
+baron
+baronage
+baroness
+baronet
+baronetcy
+baronial
+barony
+baroque
+barque
+barquisimeto
+barr
+barrack
+barracuda
+barrage
+barranquilla
+barre
+barred
+barrel
+barren
+barrenness
+barrera
+barrett
+barrette
+barricade
+barrie
+barrier
+barring
+barrio
+barrister
+barron
+barroom
+barrow
+barry
+barrymore
+bart
+bartender
+barter
+barterer
+barth
+bartholdi
+bartholomew
+bartlett
+bartok
+barton
+baruch
+baryon
+baryshnikov
+basal
+basalt
+basaltic
+base
+base's
+baseball
+baseboard
+basel
+baseless
+baseline
+basely
+baseman
+basemen
+basement
+baseness
+baser
+bash
+bashful
+bashfulness
+bashing
+basho
+basic
+basically
+basie
+basil
+basilica
+basilisk
+basin
+basinful
+basis
+bask
+basket
+basketball
+basketry
+basketwork
+basque
+basra
+bass
+basset
+basseterre
+bassinet
+bassist
+basso
+bassoon
+bassoonist
+basswood
+bast
+bastard
+bastardization
+bastardize
+bastardy
+baste
+baster
+bastille
+bastion
+basutoland
+bat
+bataan
+batch
+bate
+bates
+bath
+bathe
+bather
+bathetic
+bathhouse
+bathing
+bathmat
+bathos
+bathrobe
+bathroom
+baths
+bathsheba
+bathtub
+bathwater
+bathyscaphe
+bathysphere
+batik
+batista
+batiste
+batman
+batmen
+baton
+batsman
+batsmen
+battalion
+batted
+batten
+batter
+batterer
+battery
+batting
+battle
+battleaxe
+battledore
+battledress
+battlefield
+battlefront
+battleground
+battlement
+battler
+battleship
+batty
+batu
+bauble
+baud
+baudelaire
+baudouin
+bauer
+bauhaus
+baum
+bauxite
+bavaria
+bavarian
+bawd
+bawdily
+bawdiness
+bawdy
+bawl
+baxter
+bay
+bayamon
+bayberry
+bayer
+bayes
+bayesian
+bayeux
+baylor
+bayonet
+bayonne
+bayou
+bayreuth
+baywatch
+bazaar
+bazillion
+bazooka
+bb
+bbb
+bbc
+bbl
+bbq
+bbs
+bbses
+bc
+bdrm
+be
+beach
+beachcomber
+beachfront
+beachhead
+beachwear
+beacon
+bead
+beading
+beadle
+beady
+beagle
+beak
+beaker
+beam
+bean
+beanbag
+beanfeast
+beanie
+beanpole
+beansprout
+beanstalk
+bear
+bearable
+bearably
+beard
+beardless
+beardmore
+beardsley
+bearer
+bearing
+bearish
+bearishness
+bearlike
+bearnaise
+bearskin
+beasley
+beast
+beastliness
+beastly
+beat
+beatable
+beaten
+beater
+beatific
+beatifically
+beatification
+beatify
+beating
+beatitude
+beatlemania
+beatles
+beatnik
+beatrice
+beatrix
+beatriz
+beau
+beaufort
+beaujolais
+beaumarchais
+beaumont
+beauregard
+beaut
+beauteous
+beautician
+beautification
+beautifier
+beautiful
+beautify
+beauty
+beauvoir
+beaver
+bebop
+becalm
+became
+because
+bechtel
+beck
+becker
+becket
+beckett
+beckon
+becky
+becloud
+become
+becoming
+becquerel
+bed
+bedaub
+bedazzle
+bedazzlement
+bedbug
+bedchamber
+bedclothes
+bedded
+bedder
+bedding
+bede
+bedeck
+bedevil
+bedevilment
+bedfellow
+bedhead
+bedim
+bedimmed
+bedimming
+bedizen
+bedlam
+bedouin
+bedpan
+bedpost
+bedraggle
+bedridden
+bedrock
+bedroll
+bedroom
+bedside
+bedsit
+bedsitter
+bedsore
+bedspread
+bedstead
+bedtime
+bee
+beebe
+beebread
+beech
+beecher
+beechnut
+beef
+beefaroni
+beefburger
+beefcake
+beefiness
+beefsteak
+beefy
+beehive
+beekeeper
+beekeeping
+beeline
+beelzebub
+been
+beep
+beeper
+beer
+beerbohm
+beery
+beeswax
+beet
+beethoven
+beetle
+beeton
+beetroot
+beeves
+befall
+befell
+befit
+befitted
+befitting
+befog
+befogged
+befogging
+before
+beforehand
+befoul
+befriend
+befuddle
+befuddlement
+beg
+began
+begat
+beget
+begetter
+begetting
+beggar
+beggary
+begged
+begging
+begin
+beginner
+beginning
+begone
+begonia
+begot
+begotten
+begrime
+begrudge
+begrudging
+beguile
+beguilement
+beguiler
+beguiling
+beguine
+begum
+begun
+behalf
+behalves
+behan
+behave
+behavior
+behavioral
+behaviorism
+behaviorist
+behead
+beheld
+behemoth
+behemoths
+behest
+behind
+behindhand
+behold
+beholder
+behoove
+behring
+beiderbecke
+beige
+beijing
+being
+beirut
+bejewel
+bekesy
+bela
+belabor
+belarus
+belated
+belau
+belay
+belch
+beleaguer
+belem
+belfast
+belfry
+belg
+belgian
+belgium
+belgrade
+belie
+belief
+beliefs
+believable
+believably
+believe
+believer
+believing
+belinda
+belittle
+belittlement
+belize
+bell
+bella
+belladonna
+bellamy
+bellatrix
+bellboy
+belle
+belled
+belleek
+belletrist
+belletristic
+bellhop
+bellicose
+bellicosity
+belligerence
+belligerency
+belligerent
+belling
+bellini
+bellman
+bellmen
+bellow
+bellwether
+belly
+bellyache
+bellybutton
+bellyful
+belmont
+belmopan
+belong
+belonging
+belorussian
+beloved
+below
+belshazzar
+belt
+beltane
+beltway
+beluga
+belushi
+belying
+bemire
+bemoan
+bemuse
+bemused
+bemusement
+ben
+benacerraf
+bench
+benchley
+benchmark
+bend
+bender
+bendix
+bendy
+beneath
+benedict
+benedictine
+benediction
+benedictory
+benefaction
+benefactor
+benefactress
+benefice
+beneficence
+beneficent
+beneficial
+beneficiary
+benefit
+benelux
+benet
+benetton
+benevolence
+benevolent
+bengal
+bengali
+benghazi
+benighted
+benign
+benignant
+benignity
+benin
+beninese
+benita
+benito
+benjamin
+bennett
+bennie
+benny
+benson
+bent
+bentham
+bentley
+benton
+bentwood
+benumb
+benz
+benzedrine
+benzene
+benzine
+beowulf
+bequeath
+bequeaths
+bequest
+berate
+berber
+bereave
+bereavement
+bereft
+berenice
+beret
+beretta
+berg
+bergen
+berger
+bergerac
+bergman
+bergson
+beria
+beriberi
+bering
+berk
+berkeley
+berkelium
+berkshire
+berle
+berlin
+berliner
+berlioz
+berlitz
+berm
+bermuda
+bermudan
+bermudian
+bern
+bernadette
+bernadine
+bernanke
+bernard
+bernardo
+bernays
+bernbach
+bernese
+bernhardt
+bernice
+bernie
+bernini
+bernoulli
+bernstein
+berra
+berry
+berrylike
+berserk
+bert
+berta
+bertelsmann
+berth
+bertha
+berths
+bertie
+bertillon
+bertram
+bertrand
+beryl
+beryllium
+berzelius
+beseech
+beseecher
+beseeching
+beseem
+beset
+besetting
+beside
+besiege
+besieger
+besmear
+besmirch
+besom
+besot
+besotted
+besotting
+besought
+bespangle
+bespatter
+bespeak
+bespectacled
+bespoke
+bespoken
+bess
+bessel
+bessemer
+bessie
+best
+bestial
+bestiality
+bestiary
+bestir
+bestirred
+bestirring
+bestow
+bestowal
+bestrew
+bestrewn
+bestridden
+bestride
+bestrode
+bestseller
+bestselling
+bet
+beta
+betake
+betaken
+betcha
+betel
+betelgeuse
+beth
+bethany
+bethe
+bethesda
+bethink
+bethlehem
+bethought
+bethune
+betide
+betimes
+betoken
+betook
+betray
+betrayal
+betrayer
+betroth
+betrothal
+betrothed
+betroths
+betsy
+bette
+better
+betterment
+bettie
+betting
+bettor
+betty
+bettye
+between
+betwixt
+beulah
+bevel
+beverage
+beverley
+beverly
+bevvy
+bevy
+bewail
+beware
+bewhiskered
+bewigged
+bewilder
+bewildering
+bewilderment
+bewitch
+bewitching
+bewitchment
+bey
+beyer
+beyond
+bezel
+bf
+bhaji
+bhopal
+bhutan
+bhutanese
+bhutto
+bi
+bia
+bialystok
+bianca
+biannual
+bias
+biased
+biathlon
+bib
+bible
+biblical
+bibliographer
+bibliographic
+bibliographical
+bibliography
+bibliophile
+bibulous
+bic
+bicameral
+bicameralism
+bicarb
+bicarbonate
+bicentenary
+bicentennial
+bicep
+biceps
+bicker
+bickerer
+biconcave
+biconvex
+bicuspid
+bicycle
+bicycler
+bicyclist
+bid
+biddable
+bidden
+bidder
+bidding
+biddle
+biddy
+bide
+biden
+bidet
+bidirectional
+biennial
+biennium
+bier
+bierce
+biff
+bifocal
+bifocals
+bifurcate
+bifurcation
+big
+bigamist
+bigamous
+bigamy
+bigfoot
+bigger
+biggest
+biggie
+biggish
+biggles
+bighead
+bighearted
+bigheartedness
+bighorn
+bight
+bigmouth
+bigmouths
+bigness
+bigot
+bigotry
+bigwig
+bijou
+bijoux
+bike
+biker
+bikini
+biko
+bilabial
+bilateral
+bilbao
+bilberry
+bilbo
+bile
+bilge
+bilingual
+bilingualism
+bilious
+biliousness
+bilk
+bilker
+bill
+billboard
+billet
+billfold
+billhook
+billiard
+billiards
+billie
+billing
+billings
+billingsgate
+billion
+billionaire
+billionth
+billionths
+billow
+billowy
+billy
+billycan
+bimbo
+bimetallic
+bimetallism
+bimini
+bimonthly
+bin
+binary
+bind
+bind's
+binder
+bindery
+binding
+bindweed
+binge
+bingo
+binman
+binmen
+binnacle
+binned
+binning
+binocular
+binomial
+bio
+biochemical
+biochemist
+biochemistry
+biodegradability
+biodegrade
+biodiversity
+bioethics
+biofeedback
+biog
+biographer
+biographic
+biographical
+biography
+bioko
+biol
+biologic
+biological
+biologist
+biology
+biomass
+bionic
+bionically
+bionics
+biophysical
+biophysicist
+biophysics
+biopic
+biopsy
+biorhythm
+bios
+biosphere
+biotechnological
+biotechnology
+biotin
+bipartisan
+bipartisanship
+bipartite
+biped
+bipedal
+biplane
+bipolar
+bipolarity
+biracial
+birch
+bird
+birdbath
+birdbaths
+birdbrain
+birdcage
+birder
+birdhouse
+birdie
+birdieing
+birdlike
+birdlime
+birdseed
+birdseye
+birdsong
+birdwatcher
+birdying
+biretta
+birkenstock
+birmingham
+biro
+birth
+birthday
+birthmark
+birthplace
+birthrate
+birthright
+births
+birthstone
+biscay
+biscayne
+biscuit
+bisect
+bisection
+bisector
+bisexual
+bisexuality
+bishkek
+bishop
+bishopric
+bismarck
+bismark
+bismuth
+bison
+bisque
+bisquick
+bissau
+bistro
+bit
+bitch
+bitchily
+bitchiness
+bitchy
+bite
+biter
+biting
+bitmap
+bitnet
+bitten
+bitter
+bittern
+bitterness
+bitters
+bittersweet
+bitty
+bitumen
+bituminous
+bivalent
+bivalve
+bivouac
+bivouacked
+bivouacking
+biweekly
+biyearly
+biz
+bizarre
+bizet
+bjerknes
+bjork
+bk
+bl
+blab
+blabbed
+blabber
+blabbermouth
+blabbermouths
+blabbing
+black
+blackamoor
+blackball
+blackbeard
+blackberry
+blackbird
+blackboard
+blackburn
+blackcurrant
+blacken
+blackfeet
+blackfoot
+blackguard
+blackhead
+blacking
+blackish
+blackjack
+blackleg
+blacklist
+blackmail
+blackmailer
+blackness
+blackout
+blackpool
+blackshirt
+blacksmith
+blacksmiths
+blacksnake
+blackstone
+blackthorn
+blacktop
+blacktopped
+blacktopping
+blackwell
+bladder
+blade
+blag
+blagged
+blagging
+blah
+blahs
+blaine
+blair
+blake
+blame
+blameless
+blamelessness
+blameworthiness
+blameworthy
+blammo
+blanca
+blanch
+blanchard
+blanche
+blancmange
+bland
+blandish
+blandishment
+blandness
+blank
+blankenship
+blanket
+blankness
+blantyre
+blare
+blarney
+blase
+blaspheme
+blasphemer
+blasphemous
+blasphemy
+blast
+blaster
+blastoff
+blat
+blatancy
+blatant
+blather
+blatz
+blavatsky
+blaze
+blazer
+blazon
+bldg
+bleach
+bleached
+bleacher
+bleak
+bleakness
+blear
+blearily
+bleariness
+bleary
+bleat
+bleed
+bleeder
+bleeding
+bleep
+bleeper
+blemish
+blemished
+blench
+blend
+blender
+blenheim
+bless
+blessed
+blessedness
+blessing
+bletch
+blevins
+blew
+bligh
+blight
+blimey
+blimp
+blimpish
+blind
+blinder
+blindfold
+blinding
+blindness
+blindside
+blini
+blink
+blinker
+blintz
+blintze
+blip
+bliss
+blissful
+blissfulness
+blister
+blistering
+blistery
+blithe
+blitheness
+blither
+blithesome
+blitz
+blitzkrieg
+blivet
+blizzard
+bloat
+bloatware
+blob
+blobbed
+blobbing
+bloc
+bloch
+block
+block's
+blockade
+blockader
+blockage
+blockbuster
+blockbusting
+blocker
+blockhead
+blockhouse
+bloemfontein
+blog
+blogged
+blogger
+blogging
+bloke
+blokish
+blond
+blonde
+blondel
+blondie
+blondish
+blondness
+blood
+bloodbath
+bloodbaths
+bloodcurdling
+bloodhound
+bloodily
+bloodiness
+bloodless
+bloodlessness
+bloodletting
+bloodline
+bloodmobile
+bloodshed
+bloodshot
+bloodstain
+bloodstock
+bloodstream
+bloodsucker
+bloodsucking
+bloodthirstily
+bloodthirstiness
+bloodthirsty
+bloody
+bloom
+bloomer
+bloomfield
+bloomingdale
+bloomsbury
+bloop
+blooper
+blossom
+blossomy
+blot
+blotch
+blotchy
+blotted
+blotter
+blotting
+blotto
+blouse
+blow
+blower
+blowfly
+blowgun
+blowhard
+blowhole
+blowlamp
+blown
+blowout
+blowpipe
+blowtorch
+blowup
+blowy
+blowzy
+blt
+blu
+blubber
+blubbery
+blucher
+bludgeon
+blue
+bluebeard
+bluebell
+blueberry
+bluebird
+bluebonnet
+bluebottle
+bluefish
+bluegill
+bluegrass
+blueish
+bluejacket
+bluejeans
+blueness
+bluenose
+bluepoint
+blueprint
+bluestocking
+bluesy
+bluet
+bluetooth
+bluff
+bluffer
+bluffness
+bluing
+bluish
+blunder
+blunderbuss
+blunderer
+blunt
+bluntness
+blur
+blurb
+blurred
+blurriness
+blurring
+blurry
+blurt
+blush
+blusher
+bluster
+blusterer
+blusterous
+blustery
+blvd
+blythe
+bm
+bmw
+bo
+boa
+boadicea
+boar
+board
+boarder
+boarding
+boardinghouse
+boardroom
+boardwalk
+boas
+boast
+boaster
+boastful
+boastfulness
+boat
+boater
+boathouse
+boating
+boatload
+boatman
+boatmen
+boatswain
+boatyard
+bob
+bobbed
+bobbi
+bobbie
+bobbin
+bobbing
+bobbitt
+bobble
+bobby
+bobbysoxer
+bobcat
+bobolink
+bobsled
+bobsledded
+bobsledder
+bobsledding
+bobsleigh
+bobsleighs
+bobtail
+bobwhite
+boccaccio
+boccie
+bock
+bod
+bodacious
+bode
+bodega
+bodge
+bodhidharma
+bodhisattva
+bodice
+bodily
+bodkin
+body
+bodybuilder
+bodybuilding
+bodyguard
+bodysuit
+bodywork
+boeing
+boeotia
+boeotian
+boer
+boethius
+boffin
+boffo
+bog
+boga
+bogart
+bogey
+bogeyman
+bogeymen
+bogged
+bogging
+boggle
+boggy
+bogie
+bogometer
+bogon
+bogosity
+bogota
+bogotify
+bogus
+bogyman
+bogymen
+bohemia
+bohemian
+bohemianism
+bohr
+boil
+boiler
+boilermaker
+boilerplate
+boink
+boise
+boisterous
+boisterousness
+bojangles
+bola
+bold
+boldface
+boldness
+bole
+bolero
+boleyn
+bolivar
+bolivares
+bolivia
+bolivian
+boll
+bollard
+bollix
+bollocking
+bollocks
+bollywood
+bologna
+bolshevik
+bolshevism
+bolshevist
+bolshie
+bolshoi
+bolster
+bolt
+bolt's
+bolthole
+bolton
+boltzmann
+bolus
+bomb
+bombard
+bombardier
+bombardment
+bombast
+bombastic
+bombastically
+bombay
+bomber
+bombproof
+bombshell
+bombsite
+bonanza
+bonaparte
+bonaventure
+bonbon
+bonce
+bond
+bondage
+bondholder
+bonding
+bondman
+bondmen
+bondsman
+bondsmen
+bondwoman
+bondwomen
+bone
+bonehead
+boneless
+boner
+boneshaker
+bonfire
+bong
+bongo
+bonhoeffer
+bonhomie
+boniface
+boniness
+bonita
+bonito
+bonk
+bonn
+bonner
+bonnet
+bonneville
+bonnie
+bonny
+bono
+bonsai
+bonus
+bony
+boo
+boob
+booby
+boodle
+booger
+boogeyman
+boogeymen
+boogie
+boogieing
+boogieman
+boohoo
+book
+bookbinder
+bookbindery
+bookbinding
+bookcase
+bookend
+booker
+bookie
+booking
+bookish
+bookkeeper
+bookkeeping
+booklet
+bookmaker
+bookmaking
+bookmark
+bookmobile
+bookplate
+bookseller
+bookshelf
+bookshelves
+bookshop
+bookstall
+bookstore
+bookworm
+boole
+boolean
+boom
+boombox
+boomerang
+boon
+boondocks
+boondoggle
+boondoggler
+boone
+boonies
+boor
+boorish
+boorishness
+boost
+booster
+boot
+boot's
+bootblack
+bootee
+bootes
+booth
+booths
+bootlace
+bootleg
+bootlegged
+bootlegger
+bootlegging
+bootless
+bootstrap
+bootstrapped
+bootstrapping
+booty
+booze
+boozer
+boozy
+bop
+bopped
+bopping
+borax
+bordeaux
+bordello
+borden
+border
+borderland
+borderline
+bordon
+bore
+boreas
+boredom
+borehole
+borer
+borg
+borges
+borgia
+borglum
+boring
+boris
+bork
+borlaug
+born
+borne
+borneo
+borobudur
+borodin
+boron
+borough
+boroughs
+borrow
+borrower
+borrowing
+borscht
+borstal
+boru
+borzoi
+bosch
+bose
+bosh
+bosnia
+bosnian
+bosom
+bosom's
+bosomy
+bosporus
+boss
+bossily
+bossiness
+bossism
+bossy
+boston
+bostonian
+boswell
+bot
+botanic
+botanical
+botanist
+botany
+botch
+botcher
+both
+bother
+botheration
+bothersome
+botswana
+botticelli
+bottle
+bottleneck
+bottler
+bottom
+bottomless
+botulism
+boudoir
+bouffant
+bougainvillea
+bough
+boughs
+bought
+bouillabaisse
+bouillon
+boulder
+boules
+boulevard
+boulez
+bounce
+bouncer
+bouncily
+bounciness
+bouncy
+bound
+boundary
+bounden
+bounder
+boundless
+boundlessness
+bounteous
+bounteousness
+bountiful
+bountifulness
+bounty
+bouquet
+bourbaki
+bourbon
+bourgeois
+bourgeoisie
+bournemouth
+boustrophedon
+bout
+boutique
+boutonniere
+bouzouki
+bovary
+bovine
+bovver
+bow
+bowditch
+bowdlerization
+bowdlerize
+bowed
+bowel
+bowell
+bowen
+bower
+bowers
+bowery
+bowie
+bowl
+bowleg
+bowlegged
+bowler
+bowlful
+bowline
+bowling
+bowman
+bowmen
+bowsprit
+bowstring
+bowwow
+box
+boxcar
+boxer
+boxing
+boxlike
+boxroom
+boxwood
+boxy
+boy
+boycott
+boyd
+boyer
+boyfriend
+boyhood
+boyish
+boyishness
+boyle
+boysenberry
+bozo
+bp
+bpoe
+bps
+br
+bra
+brace
+bracelet
+bracer
+bracero
+bracken
+bracket
+brackish
+brackishness
+bract
+brad
+bradawl
+bradbury
+braddock
+bradford
+bradley
+bradly
+bradshaw
+bradstreet
+brady
+brae
+brag
+bragg
+braggadocio
+braggart
+bragged
+bragger
+bragging
+brahe
+brahma
+brahmagupta
+brahman
+brahmani
+brahmanism
+brahmaputra
+brahms
+braid
+braiding
+braille
+brain
+brainchild
+brainchildren
+braininess
+brainless
+brainpower
+brainstorm
+brainstorming
+brainteaser
+brainwash
+brainwashing
+brainwave
+brainy
+braise
+brake
+brakeman
+brakemen
+bramble
+brambly
+brampton
+bran
+branch
+branchlike
+brand
+branded
+brandeis
+branden
+brandenburg
+brander
+brandi
+brandie
+brandish
+brando
+brandon
+brandt
+brandy
+brant
+braque
+brash
+brashness
+brasilia
+brass
+brasserie
+brassiere
+brassily
+brassiness
+brassy
+brat
+bratislava
+brattain
+bratty
+bratwurst
+bravado
+brave
+braveness
+bravery
+bravo
+bravura
+brawl
+brawler
+brawn
+brawniness
+brawny
+bray
+braze
+brazen
+brazenness
+brazer
+brazier
+brazil
+brazilian
+brazos
+brazzaville
+breach
+bread
+breadbasket
+breadboard
+breadbox
+breadcrumb
+breadfruit
+breadline
+breadth
+breadths
+breadwinner
+break
+breakable
+breakage
+breakaway
+breakdown
+breaker
+breakfast
+breakfront
+breakneck
+breakout
+breakpoints
+breakspear
+breakthrough
+breakthroughs
+breakup
+breakwater
+bream
+breast
+breastbone
+breastfed
+breastfeed
+breastplate
+breaststroke
+breastwork
+breath
+breathalyze
+breathalyzer
+breathe
+breather
+breathing
+breathless
+breathlessness
+breaths
+breathtaking
+breathy
+brecht
+breckenridge
+bred
+breech
+breed
+breeder
+breeding
+breeze
+breezeway
+breezily
+breeziness
+breezy
+bremen
+brenda
+brendan
+brennan
+brenner
+brent
+brenton
+bret
+brethren
+breton
+brett
+breve
+brevet
+brevetted
+brevetting
+breviary
+brevity
+brew
+brewer
+brewery
+brewpub
+brewster
+brezhnev
+brian
+briana
+brianna
+bribe
+briber
+bribery
+brice
+brick
+brickbat
+brickie
+bricklayer
+bricklaying
+brickwork
+brickyard
+bridal
+bridalveil
+bride
+bridegroom
+bridesmaid
+bridge
+bridgeable
+bridgehead
+bridgeport
+bridger
+bridges
+bridget
+bridgetown
+bridgett
+bridgette
+bridgework
+bridgman
+bridle
+bridled
+bridleway
+brie
+brief
+brief's
+briefcase
+briefer
+briefing
+briefly
+briefness
+brier
+brig
+brigade
+brigadier
+brigadoon
+brigand
+brigandage
+brigantine
+briggs
+brigham
+bright
+brighten
+brightener
+brightness
+brighton
+brights
+brigid
+brigitte
+brill
+brilliance
+brilliancy
+brilliant
+brilliantine
+brillo
+brim
+brimful
+brimless
+brimmed
+brimming
+brimstone
+brindle
+brine
+bring
+bringer
+brininess
+brink
+brinkley
+brinkmanship
+briny
+brioche
+briquette
+brisbane
+brisk
+brisket
+briskness
+bristle
+bristly
+bristol
+brit
+britain
+britannia
+britannic
+britannica
+britches
+briticism
+british
+britisher
+britney
+briton
+britt
+brittany
+brittle
+brittleness
+brittney
+brno
+bro
+broach
+broad
+broadband
+broadcast
+broadcaster
+broadcasting
+broadcloth
+broaden
+broadloom
+broadminded
+broadness
+broadsheet
+broadside
+broadsword
+broadway
+brobdingnag
+brobdingnagian
+brocade
+broccoli
+brochette
+brochure
+brock
+brogan
+brogue
+broil
+broiler
+brokaw
+broke
+broken
+brokenhearted
+brokenness
+broker
+brokerage
+brolly
+bromide
+bromidic
+bromine
+bronc
+bronchi
+bronchial
+bronchitic
+bronchitis
+bronchus
+bronco
+broncobuster
+bronson
+bronte
+brontosaur
+brontosaurus
+bronx
+bronze
+brooch
+brood
+brooder
+broodily
+brooding
+broodmare
+broody
+brook
+brooke
+brooklet
+brooklyn
+brooks
+broom
+broomstick
+bros
+broth
+brothel
+brother
+brotherhood
+brotherliness
+broths
+brougham
+brought
+brouhaha
+brow
+browbeat
+brown
+browne
+brownfield
+brownian
+brownie
+brownish
+brownness
+brownout
+brownshirt
+brownstone
+brownsville
+browse
+browser
+brr
+brubeck
+bruce
+bruckner
+bruegel
+bruin
+bruise
+bruiser
+bruising
+bruit
+brummel
+brunch
+brunei
+bruneian
+brunelleschi
+brunet
+brunette
+brunhilde
+bruno
+brunswick
+brunt
+brush
+brushoff
+brushstroke
+brushwood
+brushwork
+brusque
+brusqueness
+brussels
+brut
+brutal
+brutality
+brutalization
+brutalize
+brute
+brutish
+brutishness
+brutus
+bryan
+bryant
+bryce
+brynner
+bryon
+brzezinski
+bs
+bsa
+bsd
+btu
+btw
+bu
+bub
+bubble
+bubblegum
+bubbly
+buber
+bubo
+buboes
+buccaneer
+buchanan
+bucharest
+buchenwald
+buchwald
+buck
+buckaroo
+buckboard
+bucket
+bucketful
+buckeye
+buckingham
+buckle
+buckle's
+buckler
+buckley
+buckner
+buckram
+bucksaw
+buckshot
+buckskin
+buckteeth
+bucktooth
+buckwheat
+bucolic
+bucolically
+bud
+budapest
+budded
+buddha
+buddhism
+buddhist
+budding
+buddy
+budge
+budgerigar
+budget
+budgetary
+budgie
+budweiser
+buff
+buffalo
+buffaloes
+buffer
+buffet
+buffoon
+buffoonery
+buffoonish
+buffy
+buford
+bug
+bug's
+bugaboo
+bugatti
+bugbear
+bugged
+bugger
+buggery
+bugging
+buggy
+bugle
+bugler
+bugzilla
+buick
+build
+builder
+building
+buildup
+built
+bujumbura
+bukhara
+bukharin
+bulawayo
+bulb
+bulbous
+bulfinch
+bulganin
+bulgar
+bulgari
+bulgaria
+bulgarian
+bulge
+bulgy
+bulimarexia
+bulimia
+bulimic
+bulk
+bulkhead
+bulkiness
+bulky
+bull
+bulldog
+bulldogged
+bulldogging
+bulldoze
+bulldozer
+bullet
+bulletin
+bulletproof
+bullfight
+bullfighter
+bullfighting
+bullfinch
+bullfrog
+bullhead
+bullheaded
+bullheadedness
+bullhorn
+bullion
+bullish
+bullishness
+bullock
+bullpen
+bullring
+bullshit
+bullshitted
+bullshitter
+bullshitting
+bullwhip
+bullwinkle
+bully
+bulrush
+bultmann
+bulwark
+bum
+bumbag
+bumble
+bumblebee
+bumbler
+bumf
+bummed
+bummer
+bummest
+bumming
+bump
+bumper
+bumph
+bumpiness
+bumpkin
+bumppo
+bumptious
+bumptiousness
+bumpy
+bun
+bunch
+bunche
+bunchy
+bunco
+bundesbank
+bundestag
+bundle
+bung
+bungalow
+bungee
+bunghole
+bungle
+bungler
+bunin
+bunion
+bunk
+bunk's
+bunker
+bunkhouse
+bunkum
+bunny
+bunsen
+bunt
+bunting
+bunuel
+bunyan
+buoy
+buoyancy
+buoyant
+bur
+burbank
+burberry
+burble
+burbs
+burch
+burden
+burden's
+burdensome
+burdock
+bureau
+bureaucracy
+bureaucrat
+bureaucratic
+bureaucratically
+bureaucratization
+bureaucratize
+burg
+burgeon
+burger
+burgess
+burgh
+burgher
+burghs
+burglar
+burglarize
+burglarproof
+burglary
+burgle
+burgomaster
+burgoyne
+burgundian
+burgundy
+burial
+burke
+burks
+burl
+burlap
+burlesque
+burliness
+burlington
+burly
+burma
+burmese
+burn
+burnable
+burner
+burnett
+burnish
+burnisher
+burnoose
+burnout
+burns
+burnside
+burnt
+burp
+burr
+burris
+burrito
+burro
+burroughs
+burrow
+burrower
+bursa
+bursae
+bursar
+bursary
+bursitis
+burst
+burt
+burton
+burundi
+burundian
+bury
+bus
+busboy
+busby
+busch
+bused
+busgirl
+bush
+bushel
+bushido
+bushiness
+bushing
+bushman
+bushmaster
+bushmen
+bushnell
+bushwhack
+bushwhacker
+bushy
+busily
+business
+businesslike
+businessman
+businessmen
+businessperson
+businesswoman
+businesswomen
+busing
+busk
+buskin
+busload
+buss
+bust
+buster
+bustle
+busty
+busy
+busybody
+busyness
+busywork
+but
+butane
+butch
+butcher
+butchery
+butler
+butt
+butte
+butted
+butter
+butterball
+buttercup
+butterfat
+butterfingered
+butterfingers
+butterfly
+buttermilk
+butternut
+butterscotch
+buttery
+butting
+buttock
+button
+button's
+buttonhole
+buttonwood
+buttress
+butty
+buxom
+buxtehude
+buy
+buyback
+buyer
+buyout
+buzz
+buzzard
+buzzer
+buzzword
+bx
+bxs
+by
+byblos
+bye
+byers
+bygone
+bylaw
+byline
+byob
+bypass
+bypath
+bypaths
+byplay
+byproduct
+byrd
+byre
+byroad
+byron
+byronic
+bystander
+byte
+byway
+byword
+byzantine
+byzantium
+c
+ca
+cab
+cabal
+cabala
+caballero
+cabana
+cabaret
+cabbage
+cabbed
+cabbing
+cabby
+cabdriver
+cabernet
+cabin
+cabinet
+cabinetmaker
+cabinetmaking
+cabinetry
+cabinetwork
+cable
+cablecast
+cablegram
+cabochon
+caboodle
+caboose
+cabot
+cabral
+cabrera
+cabrini
+cabriolet
+cabstand
+cacao
+cache
+cachepot
+cachet
+cackle
+cackler
+cacophonous
+cacophony
+cacti
+cactus
+cad
+cadaver
+cadaverous
+caddie
+caddish
+caddishness
+caddying
+cadence
+cadenza
+cadet
+cadette
+cadge
+cadger
+cadillac
+cadiz
+cadmium
+cadre
+caducei
+caduceus
+caedmon
+caerphilly
+caesar
+caesura
+cafe
+cafeteria
+cafetiere
+caff
+caffeinated
+caffeine
+caftan
+cage
+cagey
+cagier
+cagiest
+cagily
+caginess
+cagney
+cagoule
+cahokia
+cahoot
+cai
+caiaphas
+caiman
+cain
+cairn
+cairo
+caisson
+caitiff
+caitlin
+cajole
+cajolement
+cajoler
+cajolery
+cajun
+cake
+cakewalk
+cal
+calabash
+calaboose
+calais
+calamari
+calamine
+calamitous
+calamity
+calcareous
+calciferous
+calcification
+calcify
+calcimine
+calcine
+calcite
+calcium
+calculable
+calculate
+calculated
+calculating
+calculation
+calculator
+calculi
+calculus
+calcutta
+calder
+caldera
+calderon
+caldwell
+caleb
+caledonia
+calendar
+calender
+calf
+calfskin
+calgary
+calhoun
+cali
+caliban
+caliber
+calibrate
+calibration
+calibrator
+calico
+calicoes
+calif
+california
+californian
+californium
+caligula
+caliper
+caliph
+caliphate
+caliphs
+calisthenic
+calisthenics
+calk
+call
+calla
+callable
+callaghan
+callahan
+callao
+callas
+callback
+called
+caller
+callie
+calligrapher
+calligraphic
+calligraphist
+calligraphy
+calling
+calliope
+callisto
+callosity
+callous
+callousness
+callow
+callowness
+callus
+calm
+calmness
+caloocan
+caloric
+calorie
+calorific
+calumet
+calumniate
+calumniation
+calumniator
+calumnious
+calumny
+calvary
+calve
+calvert
+calvin
+calvinism
+calvinist
+calvinistic
+calypso
+calyx
+cam
+camacho
+camaraderie
+camber
+cambial
+cambium
+cambodia
+cambodian
+cambrian
+cambric
+cambridge
+camcorder
+camden
+came
+camel
+camelhair
+camellia
+camelopardalis
+camelot
+camembert
+cameo
+camera
+cameraman
+cameramen
+camerawoman
+camerawomen
+camerawork
+cameron
+cameroon
+cameroonian
+camiknickers
+camilla
+camille
+camisole
+camoens
+camouflage
+camouflager
+camp
+camp's
+campaign
+campaigner
+campanella
+campanile
+campanologist
+campanology
+campbell
+camper
+campfire
+campground
+camphor
+campinas
+camping
+campos
+campsite
+campus
+campy
+camry
+camshaft
+camus
+can
+can't
+canaan
+canaanite
+canad
+canada
+canadian
+canadianism
+canal
+canaletto
+canalization
+canalize
+canape
+canard
+canaries
+canary
+canasta
+canaveral
+canberra
+cancan
+cancel
+canceler
+cancellation
+cancer
+cancerous
+cancun
+candace
+candelabra
+candelabrum
+candice
+candid
+candida
+candidacy
+candidate
+candidature
+candide
+candidness
+candle
+candlelight
+candlelit
+candlepower
+candler
+candlestick
+candlewick
+candor
+candy
+candyfloss
+cane
+canebrake
+caner
+canine
+canister
+canker
+cankerous
+cannabis
+canned
+cannelloni
+cannery
+cannes
+cannibal
+cannibalism
+cannibalistic
+cannibalization
+cannibalize
+cannily
+canniness
+canning
+cannon
+cannonade
+cannonball
+cannot
+canny
+canoe
+canoeing
+canoeist
+canola
+canon
+canonical
+canonization
+canonize
+canoodle
+canopus
+canopy
+canst
+cant
+cant's
+cantabile
+cantabrigian
+cantaloupe
+cantankerous
+cantankerousness
+cantata
+canteen
+canter
+canterbury
+cantered
+cantering
+canticle
+cantilever
+canto
+canton
+cantonal
+cantonese
+cantonment
+cantor
+cantrell
+cantu
+canute
+canvas
+canvasback
+canvass
+canvasser
+canyon
+cap
+capabilities
+capability
+capablanca
+capable
+capably
+capacious
+capaciousness
+capacitance
+capacities
+capacitor
+capacity
+caparison
+cape
+capek
+capella
+caper
+capeskin
+capet
+capetian
+capetown
+caph
+capillarity
+capillary
+capistrano
+capital
+capitalism
+capitalist
+capitalistic
+capitalistically
+capitalization
+capitalize
+capitation
+capitol
+capitoline
+capitulate
+capitulation
+caplet
+capo
+capon
+capone
+capote
+capped
+capping
+cappuccino
+capra
+capri
+caprice
+capricious
+capriciousness
+capricorn
+capsicum
+capsize
+capstan
+capstone
+capsular
+capsule
+capsulize
+capt
+captain
+captaincy
+caption
+captious
+captiousness
+captivate
+captivation
+captivator
+captive
+captivity
+captor
+capture
+capuchin
+capulet
+car
+cara
+caracalla
+caracas
+carafe
+caramel
+caramelize
+carapace
+carat
+caravaggio
+caravan
+caravansary
+caravel
+caraway
+carbide
+carbine
+carbohydrate
+carbolic
+carboloy
+carbon
+carbonaceous
+carbonate
+carbonation
+carboniferous
+carbonize
+carborundum
+carboy
+carbuncle
+carbuncular
+carburetor
+carcass
+carcinogen
+carcinogenic
+carcinogenicity
+carcinoma
+card
+cardamom
+cardamon
+cardboard
+cardenas
+carder
+cardholder
+cardiac
+cardie
+cardiff
+cardigan
+cardin
+cardinal
+cardiogram
+cardiograph
+cardiographs
+cardiologist
+cardiology
+cardiopulmonary
+cardiovascular
+cardozo
+cardsharp
+cardsharper
+care
+careen
+career
+careerism
+careerist
+carefree
+careful
+carefuller
+carefullest
+carefulness
+caregiver
+careless
+carelessness
+carer
+caress
+caret
+caretaker
+careworn
+carey
+carfare
+cargo
+cargoes
+carhop
+carib
+caribbean
+caribou
+caricature
+caricaturist
+caries
+carillon
+carina
+caring
+carious
+carissa
+carjack
+carjacker
+carjacking
+carl
+carla
+carlene
+carlin
+carlo
+carload
+carlsbad
+carlson
+carlton
+carly
+carlyle
+carmela
+carmella
+carmelo
+carmen
+carmichael
+carmine
+carnage
+carnal
+carnality
+carnap
+carnation
+carnegie
+carnelian
+carney
+carnival
+carnivore
+carnivorous
+carnivorousness
+carnot
+carny
+carob
+carol
+carole
+caroler
+carolina
+caroline
+carolingian
+carolinian
+carolyn
+carom
+carotene
+carotid
+carousal
+carouse
+carousel
+carouser
+carp
+carpal
+carpathian
+carpel
+carpenter
+carpentry
+carper
+carpet
+carpetbag
+carpetbagged
+carpetbagger
+carpetbagging
+carpeting
+carpi
+carpool
+carport
+carpus
+carr
+carranza
+carrel
+carriage
+carriageway
+carrie
+carrier
+carrillo
+carrion
+carroll
+carrot
+carroty
+carry
+carryall
+carrycot
+carryout
+carryover
+carsick
+carsickness
+carson
+cart
+cartage
+cartel
+carter
+cartesian
+carthage
+carthaginian
+carthorse
+cartier
+cartilage
+cartilaginous
+cartload
+cartographer
+cartographic
+cartography
+carton
+cartoon
+cartoonist
+cartridge
+cartwheel
+cartwright
+caruso
+carve
+carver
+carvery
+carving
+cary
+caryatid
+casaba
+casablanca
+casals
+casandra
+casanova
+cascade
+cascades
+cascara
+case
+casebook
+cased
+caseharden
+casein
+caseload
+casement
+casework
+caseworker
+casey
+cash
+cashbook
+cashew
+cashier
+cashless
+cashmere
+casing
+casino
+casio
+cask
+casket
+caspar
+caspian
+cassandra
+cassatt
+cassava
+casserole
+cassette
+cassia
+cassie
+cassiopeia
+cassius
+cassock
+cassowary
+cast
+castaneda
+castanet
+castaway
+caste
+castellated
+caster
+castigate
+castigation
+castigator
+castillo
+casting
+castle
+castlereagh
+castoff
+castor
+castrate
+castration
+castries
+castro
+casual
+casualness
+casualty
+casuist
+casuistic
+casuistry
+cat
+cataclysm
+cataclysmal
+cataclysmic
+catacomb
+catafalque
+catalan
+catalepsy
+cataleptic
+catalina
+catalog
+cataloger
+catalonia
+catalpa
+catalysis
+catalyst
+catalytic
+catalyze
+catamaran
+catapult
+cataract
+catarrh
+catastrophe
+catastrophic
+catastrophically
+catatonia
+catatonic
+catawba
+catbird
+catboat
+catcall
+catch
+catchall
+catcher
+catchment
+catchpenny
+catchphrase
+catchword
+catchy
+catechism
+catechist
+catechize
+categorical
+categorization
+categorize
+category
+cater
+catercorner
+caterer
+caterpillar
+caterwaul
+catfish
+catgut
+catharses
+catharsis
+cathartic
+cathay
+cathedral
+cather
+catherine
+catheter
+catheterize
+cathleen
+cathode
+cathodic
+catholic
+catholicism
+catholicity
+cathryn
+cathy
+catiline
+cation
+catkin
+catlike
+catnap
+catnapped
+catnapping
+catnip
+cato
+catskill
+catskills
+catsuit
+catt
+cattail
+catted
+cattery
+cattily
+cattiness
+catting
+cattle
+cattleman
+cattlemen
+catty
+catullus
+catv
+catwalk
+caucasian
+caucasoid
+caucasus
+cauchy
+caucus
+caudal
+caught
+cauldron
+cauliflower
+caulk
+caulker
+causal
+causality
+causation
+causative
+cause
+causeless
+causer
+causerie
+causeway
+caustic
+caustically
+causticity
+cauterization
+cauterize
+caution
+cautionary
+cautious
+cautiousness
+cavalcade
+cavalier
+cavalry
+cavalryman
+cavalrymen
+cave
+caveat
+caveman
+cavemen
+cavendish
+cavern
+cavernous
+caviar
+cavil
+caviler
+caving
+cavity
+cavort
+cavour
+caw
+caxton
+cay
+cayenne
+cayman
+cayuga
+cayuse
+cb
+cbc
+cbs
+cc
+cctv
+ccu
+cd
+cdc
+cdt
+ce
+cease
+ceasefire
+ceaseless
+ceaselessness
+ceausescu
+cebu
+cebuano
+ceca
+cecal
+cecelia
+cecil
+cecile
+cecilia
+cecily
+cecum
+cedar
+cede
+ceder
+cedilla
+cedric
+ceilidh
+ceilidhs
+ceiling
+celandine
+celeb
+celebrant
+celebrate
+celebration
+celebrator
+celebratory
+celebrity
+celeriac
+celerity
+celery
+celesta
+celeste
+celestial
+celia
+celibacy
+celibate
+celina
+cell
+cellar
+cellini
+cellist
+cellmate
+cello
+cellophane
+cellphone
+cellular
+cellulite
+celluloid
+cellulose
+celsius
+celt
+celtic
+cement
+cementer
+cementum
+cemetery
+cenobite
+cenobitic
+cenotaph
+cenotaphs
+cenozoic
+censer
+censor
+censored
+censorial
+censorious
+censoriousness
+censorship
+censure
+censurer
+census
+cent
+centaur
+centaurus
+centavo
+centenarian
+centenary
+centennial
+center
+centerboard
+centerfold
+centerpiece
+centigrade
+centigram
+centiliter
+centime
+centimeter
+centipede
+central
+centralism
+centralist
+centrality
+centralization
+centralize
+centralizer
+centrifugal
+centrifuge
+centripetal
+centrism
+centrist
+centurion
+century
+ceo
+cephalic
+cepheid
+cepheus
+ceramic
+ceramicist
+ceramics
+ceramist
+cerberus
+cereal
+cerebellar
+cerebellum
+cerebra
+cerebral
+cerebrate
+cerebration
+cerebrum
+cerement
+ceremonial
+ceremonious
+ceremoniousness
+ceremony
+cerenkov
+ceres
+cerf
+cerise
+cerium
+cermet
+cert
+certain
+certainty
+certifiable
+certifiably
+certificate
+certification
+certify
+certitude
+certitudes
+cerulean
+cervantes
+cervical
+cervices
+cervix
+cesar
+cesarean
+cesium
+cessation
+cession
+cessna
+cesspit
+cesspool
+cetacean
+cetus
+ceylon
+ceylonese
+cezanne
+cf
+cfc
+cfo
+cg
+ch
+ch'in
+chablis
+chad
+chadian
+chadwick
+chafe
+chaff
+chaffinch
+chagall
+chagrin
+chain
+chain's
+chainsaw
+chair
+chairlift
+chairman
+chairmanship
+chairmen
+chairperson
+chairwoman
+chairwomen
+chaise
+chaitanya
+chaitin
+chalcedony
+chaldea
+chaldean
+chalet
+chalice
+chalk
+chalkboard
+chalkiness
+chalky
+challenge
+challenged
+challenger
+challis
+chamber
+chamberlain
+chambermaid
+chambers
+chambray
+chameleon
+chamois
+chamomile
+champ
+champagne
+champion
+championship
+champlain
+champollion
+chan
+chance
+chancel
+chancellery
+chancellor
+chancellorship
+chancellorsville
+chancery
+chanciness
+chancre
+chancy
+chandelier
+chandigarh
+chandler
+chandon
+chandra
+chandragupta
+chandrasekhar
+chanel
+chaney
+chang
+changchun
+change
+changeability
+changeable
+changeableness
+changeably
+changed
+changeless
+changeling
+changeover
+changer
+changing
+changsha
+channel
+channelization
+channelize
+chanson
+chant
+chanter
+chanteuse
+chantey
+chanticleer
+chantilly
+chaos
+chaotic
+chaotically
+chap
+chaparral
+chapati
+chapatti
+chapbook
+chapeau
+chapel
+chaperon
+chaperonage
+chaperoned
+chaplain
+chaplaincy
+chaplet
+chaplin
+chapman
+chappaquiddick
+chapped
+chapping
+chappy
+chapter
+chapultepec
+char
+charabanc
+character
+characterful
+characteristic
+characteristically
+characterization
+characterize
+characterless
+charade
+charbray
+charbroil
+charcoal
+chard
+chardonnay
+charge
+chargeable
+charged
+charger
+charily
+chariness
+chariot
+charioteer
+charisma
+charismatic
+charitable
+charitableness
+charitably
+charity
+charlady
+charlatan
+charlatanism
+charlatanry
+charlemagne
+charlene
+charles
+charleston
+charley
+charlie
+charlotte
+charlottetown
+charm
+charmaine
+charmer
+charmin
+charming
+charmless
+charolais
+charon
+charred
+charring
+chart
+charted
+charter
+charter's
+charterer
+chartism
+chartres
+chartreuse
+charwoman
+charwomen
+chary
+charybdis
+chase
+chaser
+chasity
+chasm
+chassis
+chaste
+chasten
+chasteness
+chastise
+chastisement
+chastiser
+chastity
+chasuble
+chat
+chateau
+chateaubriand
+chateaux
+chatelaine
+chatline
+chattahoochee
+chattanooga
+chatted
+chattel
+chatter
+chatterbox
+chatterer
+chatterley
+chatterton
+chattily
+chattiness
+chatting
+chatty
+chaucer
+chauffeur
+chauncey
+chautauqua
+chauvinism
+chauvinist
+chauvinistic
+chauvinistically
+chavez
+chayefsky
+che
+cheap
+cheapen
+cheapness
+cheapo
+cheapskate
+cheat
+cheater
+chechen
+chechnya
+check
+checkbook
+checked
+checker
+checkerboard
+checkers
+checklist
+checkmate
+checkoff
+checkout
+checkpoint
+checkroom
+checkup
+cheddar
+cheek
+cheekbone
+cheekily
+cheekiness
+cheeky
+cheep
+cheer
+cheerer
+cheerful
+cheerfuller
+cheerfullest
+cheerfulness
+cheerily
+cheeriness
+cheerio
+cheerios
+cheerleader
+cheerless
+cheerlessness
+cheery
+cheese
+cheeseboard
+cheeseburger
+cheesecake
+cheesecloth
+cheeseparing
+cheesiness
+cheesy
+cheetah
+cheetahs
+cheetos
+cheever
+chef
+chekhov
+chekhovian
+chelsea
+chelyabinsk
+chem
+chemical
+chemise
+chemist
+chemistry
+chemo
+chemotherapeutic
+chemotherapy
+chemurgy
+chen
+cheney
+chengdu
+chenille
+chennai
+cheops
+cheri
+cherie
+cherish
+chernenko
+chernobyl
+chernomyrdin
+cherokee
+cheroot
+cherry
+chert
+cherub
+cherubic
+cherubim
+chervil
+cheryl
+chesapeake
+cheshire
+chess
+chessboard
+chessman
+chessmen
+chest
+chester
+chesterfield
+chesterton
+chestful
+chestnut
+chesty
+chevalier
+cheviot
+chevrolet
+chevron
+chevy
+chew
+chewer
+chewiness
+chewy
+cheyenne
+chg
+chge
+chi
+chianti
+chiaroscuro
+chiba
+chibcha
+chic
+chicago
+chicagoan
+chicana
+chicane
+chicanery
+chicano
+chichi
+chick
+chickadee
+chickasaw
+chicken
+chickenfeed
+chickenhearted
+chickenpox
+chickenshit
+chickpea
+chickweed
+chicle
+chiclets
+chicness
+chicory
+chide
+chiding
+chief
+chiefdom
+chieftain
+chieftainship
+chiffon
+chiffonier
+chigger
+chignon
+chihuahua
+chilblain
+child
+childbearing
+childbirth
+childbirths
+childcare
+childhood
+childish
+childishness
+childless
+childlessness
+childlike
+childminder
+childminding
+childproof
+children
+chile
+chilean
+chili
+chilies
+chill
+chiller
+chilliness
+chilling
+chillness
+chilly
+chimborazo
+chime
+chimer
+chimera
+chimeric
+chimerical
+chimney
+chimp
+chimpanzee
+chimu
+chin
+china
+chinatown
+chinaware
+chinchilla
+chine
+chinese
+chink
+chinless
+chinned
+chinning
+chino
+chinook
+chinstrap
+chintz
+chintzy
+chinwag
+chip
+chipboard
+chipewyan
+chipmunk
+chipolata
+chipped
+chippendale
+chipper
+chippewa
+chippie
+chipping
+chippy
+chiquita
+chirico
+chirography
+chiropodist
+chiropody
+chiropractic
+chiropractor
+chirp
+chirpily
+chirpy
+chirrup
+chisel
+chiseler
+chisholm
+chisinau
+chit
+chitchat
+chitchatted
+chitchatting
+chitin
+chitinous
+chittagong
+chitterlings
+chivalrous
+chivalrousness
+chivalry
+chivas
+chive
+chivy
+chlamydia
+chlamydiae
+chloe
+chloral
+chlordane
+chloride
+chlorinate
+chlorination
+chlorine
+chlorofluorocarbon
+chloroform
+chlorophyll
+chloroplast
+chm
+choc
+chock
+chockablock
+chocoholic
+chocolate
+chocolaty
+choctaw
+choice
+choir
+choirboy
+choirmaster
+choke
+chokecherry
+choker
+choler
+cholera
+choleric
+cholesterol
+chomp
+chomsky
+chongqing
+choose
+chooser
+choosiness
+choosy
+chop
+chophouse
+chopin
+chopped
+chopper
+choppily
+choppiness
+chopping
+choppy
+chopra
+chopstick
+choral
+chorale
+chord
+chordal
+chordate
+chore
+chorea
+choreograph
+choreographer
+choreographic
+choreographically
+choreographs
+choreography
+chorister
+choroid
+chortle
+chortler
+chorus
+chose
+chosen
+chou
+chow
+chowder
+chretien
+chris
+chrism
+christ
+christa
+christchurch
+christen
+christendom
+christening
+christensen
+christi
+christian
+christianity
+christianize
+christie
+christina
+christine
+christlike
+christmas
+christmastide
+christmastime
+christoper
+christopher
+chromatic
+chromatically
+chromatin
+chrome
+chromium
+chromosomal
+chromosome
+chronic
+chronically
+chronicle
+chronicler
+chronicles
+chronograph
+chronographs
+chronological
+chronologist
+chronology
+chronometer
+chrysalis
+chrysanthemum
+chrysler
+chrysostom
+chrystal
+chub
+chubbiness
+chubby
+chuck
+chuckhole
+chuckle
+chuffed
+chug
+chugged
+chugging
+chukchi
+chukka
+chum
+chumash
+chummed
+chummily
+chumminess
+chumming
+chummy
+chump
+chunder
+chung
+chunk
+chunkiness
+chunky
+chunter
+church
+churchgoer
+churchgoing
+churchill
+churchman
+churchmen
+churchwarden
+churchwoman
+churchwomen
+churchyard
+churl
+churlish
+churlishness
+churn
+churner
+churriguera
+chute
+chutney
+chutzpah
+chuvash
+chyme
+ci
+cia
+ciao
+cicada
+cicatrices
+cicatrix
+cicero
+cicerone
+ciceroni
+cid
+cider
+cider's
+cigar
+cigarette
+cigarillo
+cilantro
+cilia
+cilium
+cimabue
+cinch
+cinchona
+cincinnati
+cincture
+cinder
+cinderella
+cindy
+cine
+cinema
+cinemascope
+cinematic
+cinematographer
+cinematographic
+cinematography
+cinerama
+cinnabar
+cinnamon
+cipher
+cipher's
+cipro
+cir
+circa
+circadian
+circe
+circle
+circlet
+circuit
+circuital
+circuitous
+circuitousness
+circuitry
+circuity
+circular
+circularity
+circularize
+circulate
+circulation
+circulatory
+circumcise
+circumcised
+circumcision
+circumference
+circumferential
+circumflex
+circumlocution
+circumlocutory
+circumnavigate
+circumnavigation
+circumpolar
+circumscribe
+circumscription
+circumspect
+circumspection
+circumstance
+circumstantial
+circumvent
+circumvention
+circus
+cirque
+cirrhosis
+cirrhotic
+cirri
+cirrus
+cisco
+cistern
+cit
+citadel
+citation
+cite
+cite's
+citibank
+citified
+citigroup
+citizen
+citizenry
+citizenship
+citric
+citroen
+citron
+citronella
+citrus
+city
+citywide
+civet
+civic
+civics
+civil
+civilian
+civility
+civilization
+civilize
+civilized
+civvies
+ck
+cl
+clack
+clad
+cladding
+claiborne
+claim
+claim's
+claimable
+claimant
+claimed
+claimer
+clair
+claire
+clairol
+clairvoyance
+clairvoyant
+clam
+clambake
+clamber
+clamberer
+clammed
+clammily
+clamminess
+clamming
+clammy
+clamor
+clamorous
+clamp
+clampdown
+clan
+clancy
+clandestine
+clang
+clangor
+clangorous
+clank
+clannish
+clannishness
+clansman
+clansmen
+clanswoman
+clanswomen
+clap
+clapboard
+clapeyron
+clapped
+clapper
+clapperboard
+clapping
+clapton
+claptrap
+claque
+clara
+clare
+clarence
+clarendon
+claret
+clarice
+clarification
+clarify
+clarinet
+clarinetist
+clarion
+clarissa
+clarity
+clark
+clarke
+clash
+clasp
+clasp's
+class
+classic
+classical
+classicism
+classicist
+classifiable
+classification
+classifications
+classified
+classified's
+classifieds
+classifier
+classify
+classiness
+classless
+classmate
+classroom
+classwork
+classy
+clatter
+claude
+claudette
+claudia
+claudine
+claudio
+claudius
+claus
+clausal
+clause
+clausewitz
+clausius
+claustrophobia
+claustrophobic
+clavichord
+clavicle
+clavier
+claw
+clay
+clayey
+clayier
+clayiest
+clayton
+clean
+cleaner
+cleaning
+cleanliness
+cleanly
+cleanness
+cleanse
+cleanser
+cleanup
+clear
+clearance
+clearasil
+clearheaded
+clearing
+clearinghouse
+clearness
+clearway
+cleat
+cleavage
+cleave
+cleaver
+clef
+cleft
+clem
+clematis
+clemenceau
+clemency
+clement
+clementine
+clemons
+clemson
+clench
+cleo
+cleopatra
+clerestory
+clergy
+clergyman
+clergymen
+clergywoman
+clergywomen
+cleric
+clerical
+clericalism
+clerk
+clerkship
+cleveland
+clever
+cleverness
+clevis
+clew
+cliburn
+cliche
+click
+clicker
+client
+clientele
+cliff
+cliffhanger
+cliffhanging
+clifford
+clifftop
+clifton
+clii
+climacteric
+climactic
+climate
+climatic
+climatically
+climatologist
+climatology
+climax
+climb
+climber
+climbing
+clime
+clinch
+clincher
+cline
+cling
+clinger
+clingfilm
+clingy
+clinic
+clinical
+clinician
+clink
+clinker
+clint
+clinton
+clio
+cliometric
+cliometrician
+cliometrics
+clip
+clipboard
+clipped
+clipper
+clipping
+clique
+cliquey
+cliquier
+cliquiest
+cliquish
+cliquishness
+clitoral
+clitorides
+clitoris
+clix
+cloaca
+cloacae
+cloak
+cloak's
+cloakroom
+clobber
+cloche
+clock
+clockwise
+clockwork
+clod
+cloddish
+clodhopper
+clog
+clog's
+clogged
+clogging
+cloisonne
+cloister
+cloistral
+clomp
+clonal
+clone
+clonk
+clop
+clopped
+clopping
+clorets
+clorox
+close
+closefisted
+closemouthed
+closeness
+closeout
+closet
+closeup
+closing
+closure
+clot
+cloth
+clothe
+clotheshorse
+clothesline
+clothespin
+clothier
+clothing
+clotho
+cloths
+clotted
+clotting
+cloture
+cloud
+cloudburst
+clouded
+cloudiness
+cloudless
+cloudy
+clouseau
+clout
+clove
+cloven
+clover
+cloverleaf
+cloverleaves
+clovis
+clown
+clownish
+clownishness
+cloy
+cloying
+club
+clubbable
+clubbed
+clubber
+clubbing
+clubfeet
+clubfoot
+clubhouse
+clubland
+cluck
+clue
+clueless
+clump
+clumpy
+clumsily
+clumsiness
+clumsy
+clung
+clunk
+clunker
+clunky
+cluster
+clutch
+clutter
+cluttered
+clvi
+clvii
+clxi
+clxii
+clxiv
+clxix
+clxvi
+clxvii
+clyde
+clydesdale
+clytemnestra
+cm
+cmdr
+cnidarian
+cnn
+cns
+co
+coach
+coachload
+coachman
+coachmen
+coachwork
+coadjutor
+coagulant
+coagulate
+coagulation
+coagulator
+coal
+coalesce
+coalescence
+coalescent
+coalface
+coalfield
+coalition
+coalitionist
+coalmine
+coarse
+coarsen
+coarseness
+coast
+coastal
+coaster
+coastguard
+coastline
+coat
+coating
+coatroom
+coattail
+coauthor
+coax
+coaxer
+coaxial
+coaxing
+cob
+cobain
+cobalt
+cobb
+cobber
+cobble
+cobbler
+cobblestone
+cobnut
+cobol
+cobra
+cobweb
+cobwebbed
+cobwebby
+coca
+cocaine
+cocci
+coccus
+coccyges
+coccyx
+cochabamba
+cochin
+cochineal
+cochise
+cochlea
+cochleae
+cochlear
+cochran
+cock
+cockade
+cockamamie
+cockatoo
+cockatrice
+cockchafer
+cockcrow
+cockerel
+cockeyed
+cockfight
+cockfighting
+cockily
+cockiness
+cockle
+cockleshell
+cockney
+cockpit
+cockroach
+cockscomb
+cocksucker
+cocksure
+cocktail
+cocky
+coco
+cocoa
+coconut
+cocoon
+cocteau
+cod
+coda
+codded
+codding
+coddle
+code
+code's
+codeine
+codependency
+codependent
+coder
+codex
+codfish
+codger
+codices
+codicil
+codification
+codifier
+codify
+codpiece
+codswallop
+cody
+coed
+coeducation
+coeducational
+coefficient
+coelenterate
+coequal
+coerce
+coercer
+coercion
+coeval
+coexist
+coexistence
+coexistent
+coextensive
+coffee
+coffeecake
+coffeehouse
+coffeemaker
+coffeepot
+coffer
+cofferdam
+coffey
+coffin
+cog
+cogency
+cogent
+cogitate
+cogitation
+cogitator
+cognac
+cognate
+cognition
+cognitional
+cognitive
+cognizable
+cognizance
+cognizant
+cognomen
+cognoscente
+cognoscenti
+cogwheel
+cohabit
+cohabitant
+cohabitation
+cohan
+coheir
+cohen
+cohere
+coherence
+coherency
+coherent
+cohesion
+cohesive
+cohesiveness
+coho
+cohort
+coif
+coiffed
+coiffing
+coiffure
+coil
+coil's
+coimbatore
+coin
+coinage
+coincide
+coincidence
+coincident
+coincidental
+coiner
+coinsurance
+cointreau
+coir
+coital
+coitus
+coke
+col
+cola
+colander
+colbert
+colby
+cold
+coldblooded
+coldness
+cole
+coleen
+coleman
+coleridge
+coleslaw
+colette
+coleus
+coley
+colfax
+colgate
+colic
+colicky
+colin
+coliseum
+colitis
+coll
+collaborate
+collaboration
+collaborationist
+collaborative
+collaborator
+collage
+collagen
+collapse
+collapsible
+collar
+collarbone
+collard
+collarless
+collate